pandas.read_csv()的chunksize参数是处理超大CSV的首选方案,返回TextFileReader迭代器,需手动循环读取各chunk,注意参数匹配、避免重复concat、动态调整及编码处理等关键细节。

用 pandas.read_csv() 的 chunksize 参数最直接
超大 CSV 无法一次性加载进内存时,read_csv() 的 chunksize 是首选方案。它不返回 DataFrame,而是返回一个 TextFileReader 迭代器,每次 next() 或用 for 循环取一个 chunk。
常见错误是误以为设了 chunksize 就自动处理完全部数据——其实只是开了个“分页读取通道”,后续逻辑得自己写循环。
-
chunksize=10000表示每块最多 10000 行,实际最后一块可能更少 - 如果 CSV 含引号嵌套、换行符等复杂格式,务必同步传入
quotechar、escapechar、lineterminator等参数,否则某块解析会报ParserError: Error tokenizing data - 避免在循环里反复调用
pd.concat()拼接所有 chunk——这又会把全部数据拉回内存;真要聚合,优先用sum()、mean()等支持分块累加的聚合操作
需要边读边过滤或转换?用 iterator=True + 手动 get_chunk()
当 chunk 大小需动态调整(比如按内存占用估算),或想在读取中途根据内容决定是否跳过某块,iterator=True 比 chunksize 更灵活:它返回可重复调用 get_chunk(nrows) 的对象。
注意 iterator=True 和 chunksize 不能共存;且一旦调用过 get_chunk(),就不能再用 for 遍历该对象。
- 适合场景:日志 CSV 中只提取
level == "ERROR"的行,其余跳过 - 调用
get_chunk(5000)后发现内存接近阈值,下次可改用get_chunk(1000) - 若文件编码不统一(如部分行是 GBK),
encoding_errors="ignore"比默认的"strict"更稳妥,避免某块因乱码中断
逐行读取更轻量?用原生 csv 模块配合 itertools.islice
当只需要提取几列字段、不做 Pandas 运算,且对速度/内存极度敏感时,绕过 Pandas 直接用 Python 标准库更快。但你要自己处理类型转换、缺失值、引号转义等细节。
让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限
典型错误是用 for row in reader: 全局遍历——这仍是单次加载整文件;必须配合 islice 分段切片。
- 示例:每次取 10000 行 →
list(islice(reader, 10000)) -
csv.DictReader可按列名访问,但首行必须是标准 header;若 header 不规范,先用next(reader)手动跳过或重命名 - 遇到
UnicodeDecodeError时,别硬试errors="replace"——先用chardet库探测真实编码,否则中文字段可能批量损坏
多进程并行读取 chunk?小心文件指针和磁盘 IO
多个进程同时读同一个 CSV 文件,看似能加速,实际常因磁盘寻道和锁竞争变慢,甚至读出错乱数据。除非文件在高速 SSD 上且已预加载到 page cache,否则不推荐。
真正有效的并行是:先用 split -l N file.csv part_ 切成多个子文件,再用 multiprocessing.Pool 分发给各进程独立读取——这时每个进程操作的是不同文件,无冲突。
- 切分时用
split -t $'\t'支持 tab 分隔,但注意不要切断跨行字段(CSV 中字段含换行需用引号包裹,split无法识别) - Pandas 读取分片后,若需合并结果,用
pd.concat(chunks, ignore_index=True),避免索引重复导致后续groupby出错 - Windows 下
split不可用,改用 PowerShell 的Get-Content | Select-Object -First分段导出,但性能较差,建议 WSL 环境下操作
Chunk 的边界永远在行尾,不是字节位置;任何试图按字节切分 CSV 的做法,都会在引号内换行处崩坏。这点容易被忽略,但决定了整个分块逻辑是否可靠。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










