Python提取大型CSV指定列至新文件的性能优化方案咨询
优化大型CSV文件列提取速度的实用方法
针对你用pandas处理大型CSV提取指定列速度慢的问题,以下是几个直接有效的优化方向:
1. 优化pandas读取参数,减少内存与计算开销
- 只读取需要的列:永远不要读取全量数据再筛选列,直接用
usecols参数指定目标列,从根源减少IO和内存占用。 - 手动指定数据类型:pandas默认的类型推断会消耗额外时间,且可能用更占内存的类型(比如默认用
int64/float64)。针对字符串列可以设为category(如果重复值多),数值列用更小的类型(比如int32/float32)。 - 使用C引擎:pandas的
read_csv默认用C引擎,比Python引擎快很多,确保engine='c'(默认无需修改,但如果之前改了要改回来)。
示例代码:
import pandas as pd # 只读取目标列,手动指定类型 df = pd.read_csv( "large_file.csv", usecols=["target_col1", "target_col2"], dtype={ "target_col1": "int32", "target_col2": "category" }, engine="c" ) df.to_csv("output.csv", index=False)
2. 分块处理,避免一次性加载全量数据
如果文件大到内存无法容纳,用chunksize参数分块读取,逐块写入输出文件,既节省内存又能稳步处理。
示例代码:
import pandas as pd chunk_size = 100000 # 可根据内存调整块大小 output_path = "output.csv" first_write = True for chunk in pd.read_csv( "large_file.csv", usecols=["target_col1", "target_col2"], chunksize=chunk_size ): # 第一次写入保留表头,后续追加时跳过 chunk.to_csv( output_path, mode="a", header=first_write, index=False ) first_write = False
3. 改用更轻量/高效的工具
如果pandas的 overhead还是太大,可以换用以下工具:
- 标准库csv模块:纯Python实现,没有pandas的额外封装,适合简单的列提取场景,速度和内存效率都不错。
示例代码:import csv target_cols = ["target_col1", "target_col2"] with open("large_file.csv", "r", newline="") as infile, open("output.csv", "w", newline="") as outfile: reader = csv.DictReader(infile) writer = csv.DictWriter(outfile, fieldnames=target_cols) writer.writeheader() for row in reader: writer.writerow({col: row[col] for col in target_cols}) - Polars库:专为大数据处理设计的库,速度和内存效率远超pandas,语法和pandas接近,学习成本低。
示例代码:import polars as pl # 直接读取目标列并写入 pl.read_csv("large_file.csv", columns=target_cols).write_csv("output.csv") - 命令行工具:如果场景极简单(比如只提取固定列),用
awk/cut等命令行工具处理速度最快,完全不需要Python:# 假设列名对应第1、2列,用awk提取 awk -F ',' 'NR==1{print $1","$2} NR>1{print $1","$2}' large_file.csv > output.csv
4. 其他细节优化
- 确保CSV文件存储在本地磁盘,避免网络文件系统(比如NFS)的IO延迟;
- 如果是压缩CSV,优先用支持流式解压的格式(比如gzip),pandas和Polars都支持直接读取
.gz文件; - 关闭pandas的
low_memory(设为False),避免分块类型推断导致的额外开销(前提是已经手动指定了dtypes)。
内容的提问来源于stack exchange,提问作者lazymonkey
相关产品推荐
相关产品推荐

