基于EMP_Code分块读取超大CSV提取匹配行的代码报错解决
解决大CSV分块匹配提取的问题
错误原因解析
- 迭代器对象不能直接下标访问:你用
iterator=True读取master_file得到的是TextFileReader迭代器,不是DataFrame,所以不能用df_items['EMP_Code']直接获取列,这才触发了TypeError。 - 表头被错误覆盖:读取master_file时加了
names=['EMP_Code'],会替换原文件的表头,导致后续列名匹配完全错误,这个参数必须去掉。
正确实现代码
import pandas as pd # 读取小文件,提取需要匹配的EMP_Code集合(集合查询效率远高于列表) file1_df = pd.read_csv("file1.csv") target_emp_codes = set(file1_df['EMP_Code'].unique()) output_file = "Employee_full_data.csv" is_first_chunk = True # 分块读取超大CSV文件,每次处理10000行 for chunk in pd.read_csv("master_file.csv", chunksize=10000): # 筛选当前块中EMP_Code匹配的行 matched_rows = chunk[chunk['EMP_Code'].isin(target_emp_codes)] # 写入文件:第一次写保留表头,后续追加不写表头 matched_rows.to_csv(output_file, mode='a', header=is_first_chunk, index=False) # 切换标记,避免后续重复写表头 if is_first_chunk: is_first_chunk = False
关键优化点
- 用集合存储目标编码:集合的成员查询是O(1)复杂度,比列表的O(n)快得多,适合大量数据的匹配场景。
- 分块读写控制内存:每次仅加载10000行到内存,处理完成后立即写入文件,不会出现内存溢出问题,完美适配20GB级别的超大CSV。
- 表头写入控制:通过
is_first_chunk标记确保仅在第一次写入时保留表头,避免输出文件出现重复表头。
内容的提问来源于stack exchange,提问作者Shourya
相关产品推荐
相关产品推荐

