python读取⽂件withopen_使⽤Python读取⼤⽂件的⽅法
背景
最近处理⽂本⽂档时(⽂件约2GB⼤⼩),出现memoryError错误和⽂件读取太慢的问题,后来到了两种⽐较快Large File Reading 的⽅法,本⽂将介绍这两种读取⽅法。
准备⼯作
我们谈到“⽂本处理”时,我们通常是指处理的内容。Python 将⽂本⽂件的内容读⼊可以操作的字符串变量⾮常容易。⽂件对象提供了三个“读”⽅法: .read()、.readline() 和 .readlines()。每种⽅法可以接受⼀个变量以限制每次读取的数据量,但它们通常不使⽤变量。
.read() 每次读取整个⽂件,它通常⽤于将⽂件内容放到⼀个字符串变量中。然⽽.read() ⽣成⽂件内容最直接的字符串表⽰,但对于连续的⾯向⾏的处理,它却是不必要的,并且如果⽂件⼤于可⽤内存,则不可能实现这种处理。下⾯是read()⽅法⽰例:
try:
f = open('/path/to/file', 'r')
ad()
finally:
if f:
f.close()
调⽤read()会⼀次性读取⽂件的全部内容,如果⽂件有10G,内存就爆了,所以,要保险起见,可以反复调⽤read(size)⽅法,每次最多读取size个字节的内容。另外,调⽤readline()可以每次读取⼀⾏内容,调⽤readlines()⼀次读取所有内容并按⾏返回list。因此,要根据需要决定怎么调⽤。
如果⽂件很⼩,read()⼀次性读取最⽅便;如果不能确定⽂件⼤⼩,反复调⽤read(size)⽐较保险;如果是配置⽂件,调⽤readlines()最⽅便:
for line adlines():
process(line) #
分块读取
处理⼤⽂件是很容易想到的就是将⼤⽂件分割成若⼲⼩⽂件处理,处理完每个⼩⽂件后释放该部分内存。这⾥⽤了iter 和 yield:
def read_in_chunks(filePath, chunk_size=1024*1024):
"""
Lazy function (generator) to read a file piece by piece.
Default chunk size: 1M
You can set your own chunk size
"""
file_object = open(filePath)
while True:
chunk_data = ad(chunk_size)
if not chunk_data:
break
yield chunk_data
if __name__ == "__main__":
filePath = './path/filename'
for chunk in read_in_chunks(filePath):
process(chunk) #
使⽤With open()
with语句打开和关闭⽂件,包括抛出⼀个内部块异常。for line in f⽂件对象f视为⼀个迭代器,会⾃动的采⽤缓冲IO和内存管理,所以你不必担⼼⼤⽂件。
代码如下:
#If the file is line based
with open(...) as f:python怎么读文件夹下的文件夹
for line in f:
process(line) #
优化
⾯对百万⾏的⼤型数据使⽤with open 是没有问题的,但是这⾥⾯参数的不同也会导致不同的效率。经过测试发先参数为"rb"时的效率是"r"的6倍。由此可知⼆进制读取依然是最快的模式。
with open(filename,"rb") as f:
for fLine in f:
pass
测试结果:rb⽅式最快,100w⾏全遍历2.9秒。基本能满⾜中⼤型⽂件处理效率需求。如果从rb(⼆级制读取)读取改为r(读取模式),慢5-6倍。
结论
在使⽤python进⾏⼤⽂件读取时,应该让系统来处理,使⽤最简单的⽅式,交给解释器,就管好⾃⼰
的⼯作就⾏了。同时根据不同的需求可以选择不同的读取参数进⼀步获得更⾼的性能。
本⽂标题: 使⽤Python读取⼤⽂件的⽅法
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论