如何高效读取大型CSV文件指定列以缩短读取时间?
大CSV单列读取性能优化方案
以下是几种能进一步缩短单列读取时间的方法,按落地成本和性能提升排序:
1. 直接使用Python标准库csv读取(无额外依赖,轻量化)
绕开pandas的DataFrame构建开销,仅提取目标列的原始数据,适合不需要DataFrame结构的场景:
import csv path = r"C:\my_path\my_csv.csv" target_col = "my_specific_col" col_data = [] with open(path, 'r', encoding='utf-8') as f: reader = csv.DictReader(f) for row in reader: col_data.append(row[target_col])
如果知道目标列的索引(比如第3列,索引从0开始),可以用csv.reader更高效:
import csv path = r"C:\my_path\my_csv.csv" col_index = 2 # 假设目标列是第3列 col_data = [] with open(path, 'r', encoding='utf-8') as f: reader = csv.reader(f) next(reader) # 跳过表头 for row in reader: col_data.append(row[col_index])
2. 优化Pandas的read_csv参数
在保留pandas DataFrame结构的前提下,通过参数减少不必要的开销:
- 指定明确的
dtype:避免pandas自动推断列类型的耗时,比如目标列是字符串就指定str,数值类型指定int64/float64:
import pandas as pd path = r"C:\my_path\my_csv.csv" target_col = "my_specific_col" df = pd.read_csv( path, usecols=[target_col], header=0, dtype={target_col: str} # 根据实际类型调整 )
- 关闭
low_memory:默认low_memory=True会分块推断列类型,可能增加耗时,明确列类型后可以关闭:
df = pd.read_csv( path, usecols=[target_col], header=0, low_memory=False )
- 确保使用C引擎:pandas默认用更快的C引擎,明确指定避免切换到Python引擎:
df = pd.read_csv( path, usecols=[target_col], header=0, engine='c' )
3. 用Polars替代Pandas(高性能列式库)
Polars是专为大数据处理设计的库,读取速度远优于pandas,尤其是单列读取场景:
import polars as pl path = r"C:\my_path\my_csv.csv" target_col = "my_specific_col" # 读取单列为Polars Series series = pl.read_csv(path, columns=[target_col]) # 如需转成Pandas DataFrame/Series df = series.to_pandas()
4. 预处理为Parquet列式存储(适合重复读取场景)
如果需要多次读取该数据集,一次性将CSV转成Parquet格式(压缩的列式存储),后续读取单列几乎瞬间完成:
第一次转换(仅需执行一次)
import pandas as pd path = r"C:\my_path\my_csv.csv" # 读取整文件转存为Parquet df = pd.read_csv(path) df.to_parquet(r"C:\my_path\my_data.parquet")
后续读取单列
df = pd.read_parquet( r"C:\my_path\my_data.parquet", columns=["my_specific_col"] )
Parquet会按列存储数据,读取时仅加载目标列对应的块,性能提升非常显著。
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

