当前位置: 首页 > 图灵资讯 > 行业资讯> Python流式读取大文件的两种方法

Python流式读取大文件的两种方法

来源:图灵python
时间: 2024-09-04 20:02:25

Python流式读取大文件的两种方法

1、使用 read 方法分块读取

使用更底层的file.read()方法不同于直接循环迭代文件对象,每次调用file.read(chunk_size)它将直接返回到当前位置并向后读取 chunk_size 没有必要等待任何换行符出现大小的文件内容。

defcount_nine_v2(fname):
"""计算文件中有多少数字'9',每次读8kb
"""
count=0
block_size=1024*8
withopen(fname)asfp:
whileTrue:
chunk=fp.read(block_size)
#当文件没有更多内容时,read调用将返回空字符串''
ifnotchunk:
break
count+=chunk.count('9')
returncount

2、使用生成器解耦代码

可以定义新的chunked_file_reader生成器函数负责与“数据生成”相关的所有逻辑。

count_nine_v3中的主循环只需负责计数即可。

defchunked_file_reader(fp,block_size=1024*8):
"""生成器函数:分块读取文件内容
"""
whileTrue:
chunk=fp.read(block_size)
#当文件没有更多内容时,read调用将返回空字符串''
ifnotchunk:
break
yieldchunk


defcount_nine_v3(fname):
count=0
withopen(fname)asfp:
forchunkinchunked_file_reader(fp):
count+=chunk.count('9')
returncount

使用 iter(callable,sentinel) 当调用它时,它将返回一个特殊的对象,迭代它将继续产生可调用对象 callable 调用结果,直到结果是 setinel 时间,迭代终止。

defchunked_file_reader(file,block_size=1024*8):
"""生成器函数:分块读取文件内容,使用iter函数
"""
#首先,使用partiall(fp.read,block_size)构建一个没有参数的新函数
#循环将继续返回fp.read(block_size)调用结果直到为''时终止
forchunkiniter(partial(file.read,block_size),''):
yieldchunk

以上是Python流式读取大文件的两种方法,希望对大家有所帮助~