Python如何读取大文件_流式读取技巧

7次阅读

python读取大文件应采用流式读取避免内存溢出:逐行读取适用于文本文件,用for line in f;按字节块读取适合二进制文件,用f.read(size);读取指定行范围可用itertools.islice;结构化数据推荐csv模块流式解析。

Python如何读取大文件_流式读取技巧

Python读取大文件不能一次性用read()readlines()加载全部内容,否则容易内存溢出。核心思路是“流式读取”——按需分块读,边读边处理,保持内存占用稳定。

逐行读取(最常用)

适用于文本文件,尤其是日志、CSV、配置等按行组织的数据。Python的文件对象本身支持迭代,内存友好且代码简洁:

  • 直接用for line in f:,每轮只加载一行到内存
  • 自动处理换行符,无需手动strip()(但空行和末尾换行仍需注意)
  • 避免f.readlines(),它会把所有行存成列表,失去流式优势

示例:

with open('huge.log', 'r', encoding='utf-8') as f:     for line in f:         if 'ERROR' in line:             print(line.rstrip())  # rstrip() 去掉换行符

按字节块读取(更底层、更灵活)

适合二进制文件(如视频、压缩包),或需要精细控制读取粒度的场景。用f.read(size)每次读固定字节数:

立即学习Python免费学习笔记(深入)”;

  • size建议设为 8192 或 65536(即 8KB 或 64KB),兼顾效率与内存
  • 返回字符串(文本模式)或bytes(二进制模式),读完返回空字符串/空bytes
  • 需自行处理数据边界(比如一行被切在两块中),文本处理慎用

示例(读取大文本并统计字符数):

count = 0 with open('big.txt', 'r', encoding='utf-8') as f:     while True:         chunk = f.read(8192)         if not chunk:             break         count += len(chunk) print(f"总字符数:{count}")

使用itertools.islice读取指定行范围

当只需处理文件中间某一段(如第10000–10100行),不希望从头遍历时:

  • 配合islice(f, start, stop)跳过前start行,只取后续若干行
  • 仍属流式——不加载无关行,内存无压力
  • 适合分页分析、抽样调试

示例(读取第5001–5010行):

from itertools import islice <p>with open('data.csv', 'r', encoding='utf-8') as f: for line in islice(f, 5000, 5010):  # 注意:起始索引从0算,5000=第5001行 print(line.rstrip())

处理超大CSV或结构化数据

纯Python逐行split()易出错(如字段含逗号、换行)。推荐用csv模块流式解析:

  • csv.reader(f)csv.DictReader(f)都支持文件对象迭代
  • 内部按行解析,自动处理引号、转义,安全可靠
  • 结合islice或条件判断,可边读边过滤、聚合

示例(读取CSV中销售额>10000的记录):

import csv <p>with open('sales.csv', 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: if float(row.get('amount', 0)) > 10000: print(row)

流式读取不是技巧砌,而是根据数据形态选对方式:文本优先逐行,二进制控块大小,结构化用专用模块,定位片段用切片。关键是让内存占用与文件大小脱钩。

text=ZqhQzanResources