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

版权声明:转载 或者复制请标注来源 https://blog.csdn.net/qq_34979346/article/details/83934181

首先讲解下场景 。
有一个文件 大概有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循环 遍历生成器的值,取到的值直接可以插入数据库。

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

`

猜你喜欢

转载自blog.csdn.net/qq_34979346/article/details/83934181