使用Python合并CSV文件时遇UTF-8解码错误求助
解决CSV合并时的UTF-8解码错误
你遇到的这个错误核心原因是部分CSV文件并非以UTF-8编码保存,而pd.read_csv()默认使用UTF-8编码读取文件,当遇到其他编码的字节时就会触发解码失败。下面给你几种可行的解决方案:
方案1:尝试指定常见的非UTF-8编码
很多非UTF-8的CSV文件会使用gbk(中文常用)、cp1252(Windows系统常用)或latin-1(兼容所有字节的通用编码),你可以用try-except的方式逐个尝试:
import glob import pandas as pd path = r'/content/drive/My Drive/DatiAirQuality/MI_Air_Quality/data' all_files = glob.glob(path + "/*.csv") li = [] for filename in all_files: # 优先尝试gbk,不行再试cp1252,最后用latin-1兜底 try: df = pd.read_csv(filename, index_col=None, header=0, encoding='gbk') except UnicodeDecodeError: try: df = pd.read_csv(filename, index_col=None, header=0, encoding='cp1252') except UnicodeDecodeError: # latin-1不会报错,但可能出现乱码,适合先确认文件内容 df = pd.read_csv(filename, index_col=None, header=0, encoding='latin-1') li.append(df) frame = pd.concat(li, axis=0, ignore_index=True)
方案2:自动检测文件编码(更精准)
可以用chardet库自动检测每个文件的编码,避免手动试错:
- 先安装依赖库:
pip install chardet
- 修改代码实现自动检测:
import glob import pandas as pd import chardet path = r'/content/drive/My Drive/DatiAirQuality/MI_Air_Quality/data' all_files = glob.glob(path + "/*.csv") li = [] for filename in all_files: # 读取文件前10KB内容来检测编码 with open(filename, 'rb') as f: detect_result = chardet.detect(f.read(10000)) # 用检测到的编码读取CSV df = pd.read_csv(filename, index_col=None, header=0, encoding=detect_result['encoding']) li.append(df) frame = pd.concat(li, axis=0, ignore_index=True)
方案3:跳过错误行(不推荐,会丢失数据)
如果只是个别行存在编码问题,且这些行的数据无关紧要,可以添加参数跳过错误行:
# 新版pandas用on_bad_lines='skip' df = pd.read_csv(filename, index_col=None, header=0, on_bad_lines='skip') # 旧版pandas用error_bad_lines=False df = pd.read_csv(filename, index_col=None, header=0, error_bad_lines=False)
内容的提问来源于stack exchange,提问作者Dimi
相关产品推荐
相关产品推荐

