在PyCharm中如何使用pandas分块功能处理超300万行的大型CSV文件
核心问题说明
你现有代码的错误点在于将pd.read_csv开启chunksize后返回的迭代器直接传入DataFrame构造函数,没有触发分块逻辑,依然会尝试加载全量数据到内存,导致无法处理300万行的大文件。
修正后可正常运行的代码
import pandas as pd import csv def reading(csv_input, chunksize=100000): originalLength = 0 rowCount = 0 dropCount = 0 # 过滤关键词集合,后续新增规则直接在此处添加即可 FILTER_KEYWORDS = {'dbk', 'ptc', 'wcf', 'google'} # 全局行号偏移,用于匹配原始文件的真实行索引 row_offset = 0 with open(f'Web Report {csv_input}', 'w', newline='', encoding='utf-8') as file: writer = csv.writer(file) writer.writerow(['Index', 'URL Category', 'User IP', 'URL']) # 迭代读取每个分块,每次仅加载chunksize指定行数到内存 for chunk in pd.read_csv(csv_input, chunksize=chunksize, usecols=['Line', 'Action', 'Site Name', 'URL Category', 'User IP']): chunk_len = len(chunk) originalLength += chunk_len # 向量化过滤,效率是逐行遍历的10倍以上 # 筛选Action等于0的行 mask_action = chunk['Action'] == 0 # 筛选Site Name不包含所有过滤关键词的行 mask_keyword = ~chunk['Site Name'].str.contains('|'.join(FILTER_KEYWORDS), na=False) valid_mask = mask_action & mask_keyword # 统计丢弃行数 dropCount += chunk_len - valid_mask.sum() # 写入符合要求的行 for _, row in chunk[valid_mask].iterrows(): writer.writerow([ row_offset + row['Line'], row['URL Category'], row['User IP'], row['Site Name'] ]) rowCount += valid_mask.sum() # 更新行偏移量 row_offset += chunk_len print(f"Input: {csv_input}") print(f"Output: Web Report {csv_input}") print(f"Original Length: {originalLength}") print(f"Current Length: {rowCount}") print(f"Drop Count: {dropCount}\n") return
优化说明
- 新增
usecols参数仅读取需要用到的列,进一步降低内存占用 - 用pandas向量化操作替代逐行判断,300万行数据可在几分钟内处理完成
- 新增
newline=''参数避免Windows系统下CSV写入出现多余空行,指定编码避免乱码 - 可根据自身设备内存大小调整
chunksize参数,内存充足的情况下设置为30万~50万可进一步提升处理速度
内容的提问来源于stack exchange,提问作者Lainey
相关产品推荐
相关产品推荐

