批量读取年份命名CSV遇ParserError,求合并为DataFrame解决方案
解决CSV解析错误并合并多文件方案
错误说明
你遇到的错误翻译为:
解析错误:第4行预期1个字段,但发现2个
这表明目标CSV文件存在格式不一致的行——pandas根据文件前几行推断出只有1列,但第4行突然出现了2个逗号分隔的字段,导致解析失败。即使指定了分隔符,格式不匹配的行仍会触发报错。
分步修复与实现
1. 定位异常文件与行
先修改代码,加入错误捕获,精准定位出问题的文件和具体行内容:
import os import pandas as pd df_dict = {} # 替换为你的文件夹路径,注意不要留多余空格 target_folder = "你的文件夹实际路径" for dirname, _, filenames in os.walk(target_folder): for filename in filenames: # 只处理CSV文件,过滤其他格式文件 if not filename.lower().endswith(".csv"): continue full_path = os.path.join(dirname, filename) print(f"正在处理: {full_path}") try: # 指定分隔符、表头行,确保解析逻辑明确 df = pd.read_csv(full_path, sep=",", header=0, engine="python", encoding="utf-8") # 添加年份列,从文件名提取(假设文件名是纯年份,比如2023.csv) df["Year"] = filename[:-4] df_dict[filename[:-4]] = df except Exception as e: print(f"文件 {filename} 解析失败: {str(e)}") # 打印异常行内容,方便排查 with open(full_path, "r", encoding="utf-8") as f: lines = f.readlines() if len(lines) >= 4: print(f"第4行内容: {lines[3].strip()}")
2. 修复CSV格式问题
根据定位出的异常行,常见问题及解决办法:
- 未转义的逗号:单元格内容包含逗号但未用双引号包裹(比如
北京,朝阳区会被解析成2列),需修改为"北京,朝阳区"; - 表头与数据列数不匹配:检查表头行的列数,修正对应数据行的字段数量;
- 空行/乱码行:直接删除这些无效行。
3. 验证列名一致性
即使列数相同,也要确保所有文件的列名完全一致,否则合并时会出现列错位。可在读取后添加列名打印:
print(f"{filename} 列名: {df.columns.tolist()}")
4. 合并所有DataFrame
所有文件成功读取后,用pd.concat()合并为完整数据集:
# 提取字典中所有DataFrame对象 all_dataframes = list(df_dict.values()) # 合并并重置索引 merged_df = pd.concat(all_dataframes, ignore_index=True) # 保存合并结果(可选) merged_df.to_csv("合并后总数据.csv", index=False, encoding="utf-8-sig")
优化提示
- 文件夹路径避免空格或特殊字符,防止路径解析错误;
- 根据文件实际编码指定
encoding参数(比如GBK编码文件用encoding="gbk"); - 若已知固定列名,可通过
usecols参数指定读取列,避免意外新增列。
内容的提问来源于stack exchange,提问作者nchrista
相关产品推荐
相关产品推荐

