Python 3.12 本身未提升 CSV 处理性能,关键在于工具组合与规避旧问题:用 polars 替代 pandas 读大文件、csv 模块逐行轻量改写、优先转 Parquet 或 DuckDB 而非依赖 CSV。

Python 3.12 本身并未为 pandas 或 csv 模块带来底层 CSV 处理的“开箱即用”性能飞跃——真正的加速来自你如何组合使用新旧工具链,以及是否规避了 3.12 中已更严格暴露的老问题(比如类型推断失败、编码异常中断)。
用 polars 替代 pandas.read_csv() 读取超大文件
3.12 环境下,pandas 的 read_csv() 在解析混合类型列或未声明 schema 时更容易抛出 ParserError 或静默转换错误;而 polars(v0.20+)在 3.12 上默认启用 PyArrow 15+ 和零拷贝字符串解析,I/O 吞吐高 2–4 倍:
- 必须显式传
dtypes或schema,否则类型推断仍会慢且不准(尤其含空值/前导零的 ID 列) - 对含千分位符、货币符号的数值列,别依赖
infer_schema_length=0,先用pl.String读入,再用str.replace_all()清洗后转数值 - 避免
pl.read_csv(path, use_pyarrow=True)+to_pandas()回退——这等于白换,直接用polarsAPI 做过滤/分组/写入
用 csv 模块做轻量级逐行改写,绕过 DataFrame 构建开销
当你只需修改单列(如统一补前缀、替换敏感词、时间戳格式化),且文件 >500MB,csv 模块比任何 DataFrame 库都快,内存占用恒定在几 MB 内:
- 务必加
newline=''参数,否则 Windows 下可能多出空行 - 用
csv.DictReader/csv.DictWriter保持字段顺序和 header 完整性,比reader+索引更安全 - 不要用
csv.writer.writerow(list)写入含逗号或换行符的字段——必须用DictWriter或确保quoting=csv.QUOTE_MINIMAL - 示例:给
"id"列每行加"USR_"前缀
import csv
with open("in.csv", "r", newline="", encoding="utf-8") as rf, \
open("out.csv", "w", newline="", encoding="utf-8") as wf:
reader = csv.DictReader(rf)
writer = csv.DictWriter(wf, fieldnames=reader.fieldnames)
writer.writeheader()
for row in reader:
row["id"] = "USR_" + row["id"]
writer.writerow(row)
合并多个大 CSV 时,禁用 pandas.concat() 全量加载
即使在 3.12 下,把 20 个 2GB CSV 全部 pd.read_csv() 再 pd.concat(),依然大概率触发 MemoryError——这不是 Python 版本问题,是设计使然:
把记录数组导出为带样式的 Excel(xlsx) 或带 BOM 的 CSV。支持列配置(表头/宽度/顺序)、表头冻结首行、斑马纹、布尔值转「是/否」、数组换行、CSV 中文防乱码。零依赖。触发词:导出 Excel、导出 CSV、记录转表格、列配置导出、数据导出、表格美化、JSON 转表格。
立即学习“Python免费学习笔记(深入)”;
- 优先走
polars.scan_csv()+.collect()流式合并:支持按列裁剪、行组过滤,且自动并行 - 若必须用 pandas,改用
dask.dataframe:它在 3.12 下调度更稳,但注意dask.delayed+pd.read_csv组合比原生dask.read_csv更易出错 - 绝对不要在循环里反复
df = pd.concat([df, new_chunk])——每次调用都复制整个 DataFrame,O(n²) 时间复杂度
压缩与格式预处理比“选更快的库”更重要
很多用户卡在“为什么换了 polars 还是慢”,其实瓶颈根本不在解析层,而在磁盘 I/O。3.12 对 zstd、lz4 的 C 扩展支持更好,但前提是你要主动用:
- 原始 CSV 转 Parquet 时,用
compression="zstd"+compression_level=9,30GB CSV 常压到 6–8GB,后续读取快 3 倍以上 - 如果只是临时合并,用
gzip压缩原始 CSV(.csv.gz),polars.read_csv("file.csv.gz")可直读,省去解压步骤 - Parquet 不支持“追加写入”,所以别指望边跑边写——合并逻辑必须设计成“全量转 Parquet → DuckDB 查询 → 导出结果”三步闭环
真正卡住进度的,往往不是 Python 版本,而是没意识到:CSV 是为交换设计的文本格式,不是存储格式。只要数据要反复读、按条件查、跨文件 join,就该在第一步就转成 Parquet 或 DuckDB 表——这个决策点,比挑哪个库、升不升级 3.12 关键得多。


















