生成器如何读取大文件

场景:500G 文件 特殊只有一行,特殊分割符号 {|}

def my_readline(f, newline):
    buf = ''
    while True:
        while newline in buf:
            pos = buf.index(newline)    # 获取分隔符在 buf 中的位置
            # 使用 yield 语句将 buf 中分隔符之前的部分作为一个行的内容生成(yield)出来。
            # 这意味着每次调用这个生成器函数时,将返回一个新的行的内容。
            yield buf[:pos]
            buf = buf[pos + len(newline):]  # 将 buf 更新为去掉已经生成的行内容后的剩余部分
        # 从文件对象 f 中读取一块数据,每次读取 40960 字节(10倍的默认缓冲区大小)。这是为了提高性能。
        chunk = f.read(4096 * 10)
        # 检查是否已经读取完整个文件
        if not chunk:
            yield buf # 如果已经读取完文件(chunk 为空),则将剩余的 buf 作为最后一行内容生成。
            break
        buf += chunk

# 读取文件
with open('input') as f:
    for line in my_readline(f, '{|}'):
        print(line)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值