python:生成器经典应用(读取只有一行500G文件)

本文详细介绍了如何处理超大文件(如500G单行文件),通过使用Python的read函数结合生成器,实现逐行读取并避免内存溢出,适用于将大数据写入数据库的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先讲解下场景 。
有一个文件 大概有500G,并且只有一行,行之间有分隔符,我们需要把文件内的数据一行一行的读取出来,
然后写入数据库里面。

有的小伙伴就报名说了,我们取行可以用open,然后用for循环。

看我的

with open(“file”)as f:
     for i in f.readlines():
        print i 
     

由于它只有一行,你这样读取会把所有数据读取出来,500G内存谁也承受不了
,这是没有办法做到的。

注意 这句话 行之间有分隔符 ,这就是咱们的切入点 。

首先解释一个函数 file.read()
1.这个read 函数并不是一次读取所有,可以传入 int 参数,代表读取的字符数
2.连续调用,可以读取偏移量的值 。
有了这个我们的问题就迎刃而解。
例子如下:

file_phth="C:/Users/PycharmProjects/test1/test.txt"

with open(file_phth,"r") as f:
    a=f.read(20)
    b=f.read(20)
    print(a,b)

打印结果:

Ten ,wang
i  lov e you , tu ran  hao 

如果有这个函数,我们就可以做到读取大数据。看下边我编写好的例子:

file_phth="C:/Users//PycharmProjects/test1/test.txt"

def  Myread(f,newline):
    bug=""       #暂存读取的而数据
    while True:
        while newline in bug:    #判断 分隔符是否在暂存数据
            pos=bug.index(newline)   #用了index 方法并且返回分隔符的下标
            yield  bug[:pos]              #取分隔符前面的值保存在生成器
            bug=bug[pos+len(newline):] # 取过值也更新bug,删除前面取的值加上分隔符
        chunk=f.read(200)  #一次200个字符   
        if not chunk:   #如果取不到值了,就用这个结束循环
            yield bug    #最后一个分隔符后边的值也保存在生成器里
            break         
        bug=bug+chunk    #200字符里最后一个分隔符后边的值 加上再次取到的chunk值 
with open(file_phth,"r") as f:

    for i in Myread(f, newline="{|}"):
        print(i)

我先解释下 工作流,这个是经典的例子并且配合的完美。

其中while 循环 是指取到的 200字符里最后一个分隔符后边的值 加上再次取到的chunk值 不停的遍历
直到把所有的分隔符前面的值取完毕。

if 语句的用意 是:
当chunk 取不到值,也就是文件内容的边界了,要结束循环,并把最后一个分隔符后边的值 再次yield。

最后一个for循环 遍历生成器的值,取到的值直接可以插入数据库。

思路:遇到超大文件,不能直接放在内存中,要分段进行读取 以减少内存的占用

`

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值