You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中如何实现从文件每次读取4行或6行内容

Python固定行数批量读取文件实现方案

需求场景

开发Python文件处理逻辑时,需要实现从目标文件每次批量读取4行或6行内容的能力,原有测试代码无法正确完成4行一组的分组读取逻辑。
原错误测试代码如下:

with open('readme.txt') as f:
    list_of_4tuples = [ (line,f.readline()) for line in f ]
for (line1,line2,line3,line4) in list_of_4tuples: # Work with them in pairs.
    print(f'a: {line1}{line2}{line3}{line4}')

原代码问题

  • 列表推导式中for line in f本身每次会读取一行,内部额外调用一次f.readline()仅能再读一行,最终每个元组只有2个元素,无法匹配4个变量的拆包逻辑,运行会直接报错
  • 遍历文件对象的同时手动调用readline()会打乱文件指针的读取顺序,造成跳行、漏行
  • 没有处理文件总行数无法被批次大小整除的边界情况,最后不足指定行数的内容要么丢失要么触发拆包异常

可行实现方案

方案1:通用生成器实现(推荐,灵活支持任意批次大小)

写一个可复用的批量读取生成器,支持自定义每次读取的行数,4行、6行场景只需要修改参数即可,同时兼容末尾不足行数的边界场景,全Python3版本兼容:

def batch_read_lines(file_obj, batch_size: int):
    """
    按固定行数批量读取文件
    :param file_obj: 已打开的文件对象
    :param batch_size: 每次读取的行数,支持传4、6等任意正整数
    """
    while True:
        current_batch = []
        for _ in range(batch_size):
            line = file_obj.readline()
            if not line:
                break
            current_batch.append(line)
        if not current_batch:
            break
        yield current_batch

# 4行一组读取示例
with open('readme.txt', 'r', encoding='utf-8') as f:
    for group in batch_read_lines(f, batch_size=4):
        # 末尾不足4行时按需补空行,不需要补可以直接跳过长度判断
        if len(group) < 4:
            group.extend([''] * (4 - len(group)))
        line1, line2, line3, line4 = group
        print(f'a: {line1}{line2}{line3}{line4}')

# 6行一组读取只需要把batch_size参数改成6即可
# with open('readme.txt', 'r', encoding='utf-8') as f:
#     for group in batch_read_lines(f, batch_size=6):
#         print(group)

方案2:基于itertools标准库的简洁实现

如果不想额外写工具函数,可以直接用itertools.islice实现切片式批量读取,代码更精简(适用Python3.8+版本):

from itertools import islice

with open('readme.txt', 'r', encoding='utf-8') as f:
    # islice第二个参数传4就是每次读4行,传6就是每次读6行
    while group := list(islice(f, 4)):
        # 末尾不足行数补空行逻辑和上面一致
        if len(group) < 4:
            group.extend([''] * (4 - len(group)))
        line1, line2, line3, line4 = group
        print(f'a: {line1}{line2}{line3}{line4}')

注意事项

  • 打开文件时建议显式指定文件编码,避免不同系统下默认编码不一致导致的乱码问题
  • 如果业务逻辑要求丢弃末尾不足指定行数的分组,只需要在拿到group后加个长度判断,长度不符合就直接跳过即可
  • 大文件场景下两种方案都是逐批次读取,不会一次性把整个文件加载到内存,内存占用稳定

内容的提问来源于stack exchange,提问作者M A Nezam Sagor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 01:27:17