You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pandas批量合并百余个CSV文件时UnicodeDecodeError的解决方法

解决CSV合并时的UnicodeDecodeError问题

先修正原代码的基础问题

原代码存在语法和逻辑错误,先做调整:

  1. 模块导入需分行书写
  2. 先判断文件后缀再执行读取操作,避免读取非CSV文件引发错误
  3. 用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库自动检测编码,无需逐个排查:

  1. 先安装chardet:pip install chardet
  2. 使用以下代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 06:50:24