批量处理CSV合并指定列时遇UTF-8解码错误,求解决方法
解决CSV文件读取时的UTF-8解码错误及合并列的完整方案
嗨,我来帮你搞定这个问题!你遇到的'utf-8' codec can't decode byte 0xa9错误,本质上是因为要读取的CSV文件并不是用UTF-8编码保存的,咱们一步步来解决:
一、先搞定编码错误问题
这个错误里的0xa9是版权符号©的ISO-8859-1编码,说明文件用了UTF-8以外的编码格式,这里给你两种解决思路:
1. 尝试常见编码直接读取
直接给pd.read_csv()指定其他常用编码,比如:
- 中文系统里常见的GBK编码:
pd.read_csv(file_path, encoding='gbk') - 兼容更多西文字符的ISO-8859-1编码:
pd.read_csv(file_path, encoding='ISO-8859-1') - Windows下保存的带BOM的UTF-8文件:
pd.read_csv(file_path, encoding='utf-8-sig')
2. 自动检测文件编码(更稳妥)
如果你不确定文件编码,可以用chardet库自动检测:
注意:先通过pip install chardet安装这个库
import chardet with open("你的CSV文件路径", 'rb') as f: result = chardet.detect(f.read()) print(result['encoding']) # 输出检测到的编码,比如'GB2312'、'ISO-8859-1'等
拿到编码后,把它传入pd.read_csv()即可。
二、完整的遍历CSV+合并列代码
结合你的需求,这里给出修改后的完整代码,既解决了编码问题,又实现了按索引遍历、合并指定列、保存新文件的功能:
import os import pandas as pd import chardet # 配置参数,记得替换成你的实际路径和表头 input_dir = "你的原CSV文件夹路径" output_dir = "你的新文件保存路径" columns_to_merge = ["wellkey", "drillkey"] # 替换成你要合并的指定表头 new_column_name = "合并后的新列名" # 自动创建输出文件夹(不存在则创建) os.makedirs(output_dir, exist_ok=True) # 按索引循环遍历所有CSV文件 for idx, filename in enumerate(os.listdir(input_dir)): if filename.endswith(".csv"): file_path = os.path.join(input_dir, filename) print(f"正在处理第{idx+1}个文件:{filename}") # 自动检测文件编码并读取 with open(file_path, 'rb') as f: encode_info = chardet.detect(f.read()) df = pd.read_csv(file_path, encoding=encode_info['encoding']) # 合并指定列(这里用空格连接,可改成'-'/'_'等分隔符) df[new_column_name] = df[columns_to_merge].apply(lambda x: ' '.join(x.astype(str)), axis=1) # 保存处理后的文件,用UTF-8编码避免后续乱码 output_path = os.path.join(output_dir, f"processed_{filename}") df.to_csv(output_path, index=False, encoding='utf-8') print(f"处理完成,已保存至:{output_path}")
三、代码关键点说明
- 用
enumerate实现按索引循环遍历文件,满足你的需求 - 合并列用
apply+lambda,把指定列内容转成字符串后拼接,你可以根据需要修改分隔符 - 保存时指定
encoding='utf-8',确保新文件是通用编码,避免后续再出现编码问题 os.makedirs(output_dir, exist_ok=True)会自动创建输出文件夹,已存在也不会报错
内容的提问来源于stack exchange,提问作者Sammy
相关产品推荐
相关产品推荐

