You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用pd.concat合并CSV文件报错UnicodeDecodeError:utf-8无法解码字节0xff

解决pandas读取CSV时的UnicodeDecodeError问题

这个报错我碰到过好多次啦,本质就是你要读取的CSV文件不是UTF-8编码——pandas默认用utf-8解码,自然就和文件的实际编码不匹配,导致解码失败。其中byte 0xff这个提示很关键,它大概率是UTF-16编码(小端序)的BOM标识,当然也有可能是GBK/GB2312这类中文环境常用编码。

方法一:先精准检测文件编码

可以用chardet库自动识别文件编码,步骤很简单:

  1. 先安装chardet:
pip install chardet
  1. 拿其中一个报错的CSV文件做测试,运行这段小代码:
import chardet

with open('你的目标文件名.csv', 'rb') as f:
    result = chardet.detect(f.read())
print(f"检测到的文件编码:{result['encoding']}")

运行后就能得到文件的真实编码,比如utf-16GB2312之类的。

方法二:修改读取代码,指定正确编码

拿到编码后,直接在pd.read_csv里加上encoding参数即可。比如检测出是utf-16,就把代码改成这样:

combined_csv = pd.concat([pd.read_csv(f, encoding='utf-16') for f in all_filenames])

要是暂时不想装chardet,也可以直接试试几个常见编码碰运气:

  • utf-16:对应带BOM的双字节编码文件
  • gbk/gb2312:中文Windows环境生成的文件常用
  • cp1252:英文Windows环境的常见编码

完整修改后的示例代码

假设检测出编码是utf-16,完整代码如下:

import os
import glob
import pandas as pd
os.chdir("S/Last Processed Data")
extension = 'csv'
all_filenames = [i for i in glob.glob('*.{}'.format(extension))]
# 新增encoding参数指定正确编码
combined_csv = pd.concat([pd.read_csv(f, encoding='utf-16') for f in all_filenames])
combined_csv.to_csv( "combined_csv.csv", index=False, encoding='utf-8-sig')

额外小技巧:处理编码不一致的文件

如果文件夹里的CSV编码不统一,可以加个异常处理,自动尝试不同编码读取:

dfs = []
for f in all_filenames:
    try:
        df = pd.read_csv(f)
        dfs.append(df)
    except UnicodeDecodeError:
        # 先尝试utf-16
        try:
            df = pd.read_csv(f, encoding='utf-16')
            dfs.append(df)
        except:
            # 再尝试gbk
            df = pd.read_csv(f, encoding='gbk')
            dfs.append(df)
combined_csv = pd.concat(dfs)

内容的提问来源于stack exchange,提问作者Wei Chen

火山引擎 最新活动