使用pd.concat合并CSV文件报错UnicodeDecodeError:utf-8无法解码字节0xff
解决pandas读取CSV时的UnicodeDecodeError问题
这个报错我碰到过好多次啦,本质就是你要读取的CSV文件不是UTF-8编码——pandas默认用utf-8解码,自然就和文件的实际编码不匹配,导致解码失败。其中byte 0xff这个提示很关键,它大概率是UTF-16编码(小端序)的BOM标识,当然也有可能是GBK/GB2312这类中文环境常用编码。
方法一:先精准检测文件编码
可以用chardet库自动识别文件编码,步骤很简单:
- 先安装chardet:
pip install chardet
- 拿其中一个报错的CSV文件做测试,运行这段小代码:
import chardet with open('你的目标文件名.csv', 'rb') as f: result = chardet.detect(f.read()) print(f"检测到的文件编码:{result['encoding']}")
运行后就能得到文件的真实编码,比如utf-16、GB2312之类的。
方法二:修改读取代码,指定正确编码
拿到编码后,直接在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




