合并7个CSV文件时触发KeyError: 'record_id'问题求助
解决KeyError: 'record_id'并合并多个CSV文件的方案
嘿,我来帮你搞定这个问题!你遇到的KeyError: 'record_id'其实是因为代码里读取CSV的方式错了——你把文件路径传给了io.StringIO(),但StringIO是用来处理字符串内容的,不是文件路径。这就导致pd.read_csv根本没读到真实的CSV数据,而是把路径字符串当成了CSV内容,自然找不到record_id列啦。
第一步:修正两个文件的合并代码
先把读取文件的方式改对,直接用文件路径传给pd.read_csv就行,不需要StringIO。这里给你修正后的代码:
import pandas as pd import os # 定义两个文件的路径 f0 = r'C:\PythonWorking\xxxData\SYLK_fix\FeMRExportDataFile0.csv' f1 = r'C:\PythonWorking\xxxData\SYLK_fix\FeMRExportDataFile1.csv' # 直接读取CSV文件(这才是正确的打开方式!) data_0 = pd.read_csv(f0) data_1 = pd.read_csv(f1) # 先检查两个文件是否都包含'record_id'列,提前规避错误 if 'record_id' not in data_0.columns or 'record_id' not in data_1.columns: raise ValueError("其中一个CSV文件缺少'record_id'列,请检查文件内容!") # 基于record_id执行outer合并(如果要左连接就把how改成'left') merged_df = pd.merge(data_0, data_1, on='record_id', how='outer') # 保存结果,index=False避免生成多余的索引列 final_csv = r'C:\PythonWorking\xxxData\SYLK_fix\FeMRExportDataFile0_6Merged.csv' merged_df.to_csv(final_csv, index=False)
第二步:扩展到7个文件的批量合并
既然你要合并7个文件,手动写7次合并太麻烦了,用循环批量处理更高效。下面是适配7个文件的代码,还加了错误检查,避免某个文件缺列导致整个程序崩溃:
import pandas as pd import os # 定义文件夹路径和文件前缀 folder_path = r'C:\PythonWorking\xxxData\SYLK_fix' file_prefix = 'FeMRExportDataFile' total_files = 7 # 从0到6共7个文件 # 先读取第一个文件作为合并的基础 merged_df = pd.read_csv(os.path.join(folder_path, f'{file_prefix}0.csv')) # 检查基础文件是否有record_id if 'record_id' not in merged_df.columns: raise ValueError("第一个CSV文件缺少'record_id'列,请先检查!") # 循环合并剩下的6个文件 for file_num in range(1, total_files): current_file = os.path.join(folder_path, f'{file_prefix}{file_num}.csv') current_df = pd.read_csv(current_file) # 检查当前文件是否有record_id,没有就跳过并提示 if 'record_id' not in current_df.columns: print(f"⚠️ 警告:文件{current_file}缺少'record_id'列,已跳过该文件!") continue # 执行outer合并(如果需要左连接就改成how='left') merged_df = pd.merge(merged_df, current_df, on='record_id', how='outer') # 保存最终合并结果 final_output = os.path.join(folder_path, 'FeMRExportDataFile0_6Merged.csv') merged_df.to_csv(final_output, index=False) print("🎉 合并完成!最终文件已保存到指定路径。")
一些额外的小提示
- 如果你的CSV文件有特殊分隔符(比如制表符),可以在
pd.read_csv里加sep='\t'参数调整 - 如果遇到编码问题(比如中文乱码),试试
encoding='utf-8-sig'或者encoding='gbk' - 如果需要保留所有
record_id(不管哪个文件里的),就用how='outer';如果只想保留第一个文件里的record_id,就用how='left'
内容的提问来源于stack exchange,提问作者FauziaK
相关产品推荐
相关产品推荐

