应使用pandas.read_csv()的chunksize参数分块读取大csv文件,避免内存溢出;需校验列名、处理无表头情况、用累加器控制按行数切分、安全命名输出文件、防范路径遍历、容错处理编码与解析错误,并统计跳过行数。

用 pandas.read_csv() 逐块读取,避免内存爆炸
直接 pandas.read_csv() 整个大文件会把全部数据加载进内存,几百万行的 CSV 很容易触发 MemoryError。必须用 chunksize 参数分块读——它返回一个可迭代的 TextFileReader 对象,每次只拿固定行数(比如 10000 行)。
注意:不要用 iterator=True 单独配 chunksize,新版 pandas 中 chunksize 自带迭代行为;也不要用 skiprows + nrows 手动跳读,效率低且易错行。
-
chunksize值建议设为 5000–50000,具体看单行平均字节数和可用内存 - 首次读 chunk 时检查列名是否一致(
df.columns),防止后续 chunk 列缺失或错位 - 如果原 CSV 没有表头,务必加
header=None,否则第一行会被误当列名丢掉
按目标行数切分时,用累计计数器控制写入逻辑
不能简单把每个 chunk 当作一个输出文件——因为 chunk 大小是固定的,而你想要的是「每个输出文件恰好 N 行」(比如每 10000 行一个文件)。得靠一个累加器跟踪已写总行数,并在达到阈值时新建文件。
关键点在于:当前 chunk 可能跨两个输出文件边界。例如还差 200 行到 10000,而当前 chunk 有 500 行,那就得把前 200 行写进上一个文件,剩下 300 行留到下一个文件开头。
SkillSub Pro - Python 题解与代码注释双功能技能功能概述SkillSub Pro - Python 题解与代码注释双功能技能是一项面向实际任务的技能,主要用于SkillSub Pro 是一个 Python 题解生成与代码注释的 双功能合体技能 ,专为学生、算法学习者和开发者设计;✅ 一个技能,两种用途 :;核心要点📝 题解模式 :输入题目/题号,自动生成完整 Python 题解(含详细注释、解题思路、复杂度分析);💬 注释模式 :输入 Python 代码,自动添加详细中。它将相关步骤、
- 用
total_written = 0初始化计数器 - 对每个
chunk,循环处理每一行(for idx, row in chunk.iterrows())或用numpy.array_split切片更高效 - 写入时用
mode='a'追加,首次写入用mode='w'并写表头(header=True)
文件命名要带序号和原始名特征,避免覆盖或混淆
批量处理几十上百个 CSV 时,输出名如果只是 part_1.csv、part_2.csv,根本分不清是谁的。必须嵌入源文件标识。
推荐格式:{basename}_part{seq:03d}.csv,其中 basename 是原文件名去后缀(如 sales_2023.csv → sales_2023),seq 从 1 开始递增。这样既保序又可追溯。
- 用
os.path.splitext(os.path.basename(filepath))[0]安全提取 basename - 避免在路径中拼接用户输入的文件名,防止路径遍历(如
../malicious.csv) - 输出目录最好提前
os.makedirs(output_dir, exist_ok=True)创建好
遇到编码错误或脏数据时,别让整个流程中断
真实业务 CSV 常含乱码(如 GBK 编码却用 utf-8 打开)、空行、字段数不一致等。用 try/except 包裹单个 chunk 处理逻辑,记录警告而非崩溃。
尤其注意 UnicodeDecodeError 和 ParserError:前者换 encoding='gb18030' 或 errors='ignore';后者加 on_bad_lines='skip'(pandas ≥ 1.3.0)或降级用 error_bad_lines=False(旧版)。
- 日志建议写到单独的
error.log,记录文件名、chunk 序号、错误类型和首几行内容 - 跳过的行数应统计并最后汇总输出,方便评估数据损失比例
- 别依赖
pd.read_csv(..., encoding='utf-8')硬指定,先用chardet库探测(但注意它本身有性能开销)
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










