首先讲解下场景 。
有一个文件 大概有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循环 遍历生成器的值,取到的值直接可以插入数据库。
思路:遇到超大文件,不能直接放在内存中,要分段进行读取 以减少内存的占用
`