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

5a2f58836614fc86a2648903a8d1b359.png

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

1、使用 read 方法分块读取

使用更底层的file.read()方法,与直接循环迭代文件对象不同,每次调用file.read(chunk_size)会直接返回从当前位置往后读取 chunk_size 大小的文件内容,不必等待任何换行符出现。def count_nine_v2(fname):

"""计算文件里包含多少个数字 '9',每次读取 8kb

"""

count = 0

block_size = 1024 * 8

with open(fname) as fp:

while True:

chunk = fp.read(block_size)

# 当文件没有更多内容时,read 调用将会返回空字符串 ''

if not chunk:

break

count += chunk.count('9')

return count

2、利用生成器解耦代码

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

count_nine_v3里面的主循环就只需要负责计数即可。def chunked_file_reader(fp, block_size=1024 * 8):

"""生成器函数:分块读取文件内容

"""

while True:

chunk = fp.read(block_size)

# 当文件没有更多内容时,read 调用将会返回空字符串 ''

if not chunk:

break

yield chunk

def count_nine_v3(fname):

count = 0

with open(fname) as fp:

for chunk in chunked_file_reader(fp):

count += chunk.count('9')

return count

使用 iter(callable,sentinel) 的方式调用它时,会返回一个特殊的对象,迭代它将不断产生可调用对象 callable 的调用结果,直到结果为 setinel 时,迭代终止。def chunked_file_reader(file, block_size=1024 * 8):

"""生成器函数:分块读取文件内容,使用 iter 函数

"""

# 首先使用 partial(fp.read, block_size) 构造一个新的无需参数的函数

# 循环将不断返回 fp.read(block_size) 调用结果,直到其为 '' 时终止

for chunk in iter(partial(file.read, block_size), ''):

yield chunk

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值