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
相关产品推荐
相关产品推荐

