从Amazon S3存储桶下载CSV文件时出现解码错误如何解决
解决方案
问题原因
0x94是Windows-1252(cp1252)编码下的右双引号字符,不属于标准UTF-8编码范围。file命令的编码识别仅做参考,存在准确率不足的问题,latin-1编码虽然可以无报错读取该字节,但会映射为不可见控制字符,因此显示为乱码。
可直接使用的修复方案
- 方案1:优先尝试Windows-1252编码解码
大部分出现该错误的CSV都是Windows平台Excel导出的文件,直接替换解码规则即可:s3 = boto3.client('s3') obj = s3.get_object(Bucket='BUCKET_NAME', Key='FILE_NAME') # 替换utf-8为cp1252即可 data = obj['Body'].read().decode('cp1252').splitlines() - 方案2:自动检测文件编码
如果不确定编码,使用chardet库自动识别:
先安装依赖:pip install chardet
对应代码:import chardet import boto3 s3 = boto3.client('s3') obj = s3.get_object(Bucket='BUCKET_NAME', Key='FILE_NAME') raw_content = obj['Body'].read() # 检测编码 detect_result = chardet.detect(raw_content) encoding = detect_result['encoding'] # 用检测到的编码解码 data = raw_content.decode(encoding).splitlines() - 方案3:用pandas直接读取S3 CSV
pandas内置了编码兼容处理,也可以直接读取:
先安装依赖:pip install pandas s3fs
对应代码:import pandas as pd df = pd.read_csv('s3://BUCKET_NAME/FILE_NAME', encoding='cp1252') # 也可以指定encoding参数为auto自动检测 - 方案4:临时忽略错误排查问题
如果上述方案都不生效,可以先忽略解码错误,定位异常字符的位置排查:data = obj['Body'].read().decode('utf-8', errors='ignore').splitlines()
额外排查点
- 检查S3对象的元数据,确认上传时是否错误设置了
Content-Encoding头为错误值 - 确认文件上传过程中是否被中途修改过编码
内容的提问来源于stack exchange,提问作者Nava Braulio
相关产品推荐
相关产品推荐

