You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

S3 JSON文件读取后打印出现UnicodeEncodeError问题求助

解决S3读取JSON后打印出现的UnicodeEncodeError问题

错误根源

这个报错不是读取S3文件时的解码出了问题——你用decode("utf-8")已经正确把字节转成了Unicode字符串。问题出在打印输出环节:你的终端默认用的是系统charmap编码(比如Windows的cp1252),而JSON里包含一些这个编码不支持的特殊字符,导致编码失败。

几种可行的解决办法

1. 强制用UTF-8编码输出

直接绕开终端的默认编码,强制用UTF-8处理打印:

import sys
import boto3

s3 = boto3.client("s3") 
# 注意Key参数要传字符串,Bucket和Key需分开指定
response = s3.get_object(Bucket="some_bucket", Key="XYZ_445643_Split0_A.json")
data = response["Body"].read().decode("utf-8") 
data = data.split('##')[1]

# 方式一:先编码再解码确保UTF-8格式
print(data.encode('utf-8').decode('utf-8'))

# 方式二:直接写入标准输出缓冲区
sys.stdout.buffer.write(data.encode('utf-8'))
sys.stdout.buffer.write(b'\n')

2. 处理无法编码的字符

如果不需要保留那些特殊字符,可以选择替换或忽略:

import boto3
import sys

s3 = boto3.client("s3") 
response = s3.get_object(Bucket="some_bucket", Key="XYZ_445643_Split0_A.json")
data = response["Body"].read().decode("utf-8") 
data = data.split('##')[1]

# 把无法编码的字符替换成?
print(data.encode(sys.stdout.encoding, errors='replace').decode(sys.stdout.encoding))

# 或者直接忽略无法编码的字符
# print(data.encode(sys.stdout.encoding, errors='ignore').decode(sys.stdout.encoding))

3. 修改终端编码

  • Windows终端:打开终端后先执行chcp 65001切换到UTF-8编码,再运行Python脚本。
  • Linux/macOS终端:检查环境变量LC_ALL和LANG是否设置为en_US.UTF-8(或其他UTF-8编码),如果不是就手动调整。

额外提醒

原代码里的Key参数格式错误,Bucket名称已经在Bucket参数里指定,Key只需要传桶内的文件路径字符串,不能写成some_bucket/XYZ_445643_Split0_A.json,要改成"XYZ_445643_Split0_A.json"。

内容的提问来源于stack exchange,提问作者VN-

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:15:59