使用Pandas批量合并百余个CSV文件时UnicodeDecodeError的解决方法
解决CSV合并时的UnicodeDecodeError问题
先修正原代码的基础问题
原代码存在语法和逻辑错误,先做调整:
- 模块导入需分行书写
- 先判断文件后缀再执行读取操作,避免读取非CSV文件引发错误
- 用
pd.concat替代append提升效率(append已被标记为过时方法)
针对UnicodeDecodeError的解决方案
虽然生成CSV时指定了UTF-8编码,但部分文件可能因特殊字符、BOM头或编码偏差导致读取失败,可通过以下方法处理:
方法1:指定UTF-8编码并添加错误处理
直接在pd.read_csv中指定encoding='utf-8',同时用errors='replace'替换解码失败的字符,避免程序崩溃:
import os import pandas as pd df_list = [] directory_path = '/pandas learning/data3' for file in os.listdir(directory_path): if file.endswith('.csv'): # 用os.path.join拼接路径,适配不同操作系统 file_path = os.path.join(directory_path, file) # 读取时指定编码并处理解码错误 df = pd.read_csv(file_path, encoding='utf-8', errors='replace') df_list.append(df) # 合并所有DataFrame并重置索引 final_df = pd.concat(df_list, ignore_index=True) # 保存时同样指定UTF-8编码 final_df.to_csv("final.csv", index=False, encoding='utf-8')
方法2:尝试UTF-8带BOM编码
如果是Windows环境下生成的文件,可能带有UTF-8 BOM头,改用utf-8-sig编码读取即可:
# 仅修改read_csv的encoding参数 df = pd.read_csv(file_path, encoding='utf-8-sig', errors='replace')
方法3:自动检测文件编码
如果少数文件编码确实异常,可使用chardet库自动检测编码,无需逐个排查:
- 先安装chardet:
pip install chardet - 使用以下代码:
import os import pandas as pd import chardet def get_file_encoding(file_path): # 读取文件前10KB内容检测编码 with open(file_path, 'rb') as f: raw_data = f.read(10240) return chardet.detect(raw_data)['encoding'] df_list = [] directory_path = '/pandas learning/data3' for file in os.listdir(directory_path): if file.endswith('.csv'): file_path = os.path.join(directory_path, file) encoding = get_file_encoding(file_path) # 用检测到的编码读取,同时处理错误 df = pd.read_csv(file_path, encoding=encoding, errors='replace') df_list.append(df) final_df = pd.concat(df_list, ignore_index=True) final_df.to_csv("final.csv", index=False, encoding='utf-8')
关键注意点
- 避免直接字符串拼接路径,用
os.path.join保证跨系统兼容性 pd.concat比循环append效率高数十倍,尤其适合大量文件合并场景errors='replace'会将无法解码的字符替换为�,如果需要保留原始字符,可尝试errors='ignore'(但会丢失该字符)
内容的提问来源于stack exchange,提问作者Elham Ashrafizadeh
相关产品推荐
相关产品推荐

