Python 2.7中两种JSON读取编码写法的差异咨询
Python 2.7下两种JSON读取写法的编码差异解析
核心差异:字符串类型与编码时机的不同
Python 2.7存在两种字符串类型:str(字节串)和unicode(Unicode文本),这是理解两种写法差异的核心。
写法一的逻辑
with codecs.open(<file path>, 'r', encoding='my_enc') as f: data = json.load(f) # 原代码将结果赋值给`json`会覆盖模块,属于语法错误 string = data['key']
codecs.open指定encoding='my_enc'后,会把文件中的字节按my_enc编码规则解码为Unicode字符串(unicode类型)json.load读取该Unicode流后,解析出的字典中,所有字符串值均为unicode类型- 最终
string是unicode类型,若后续代码仅接受字节串(str类型),直接使用会触发编码错误(如打印到非Unicode终端、写入未指定编码的文件)
写法二的逻辑
with open(<file path>, 'r') as f: data = json.load(f) # 修正变量名避免覆盖模块 string = data['key'].encode('my_enc')
- Python 2.7中
open默认读取的是字节串(str类型),json.load处理字节串时,会默认按utf-8解码为unicode(你的写法二能运行,说明JSON文件编码与该默认解码规则兼容) - 调用
.encode('my_enc')会将unicode类型重新编码为my_enc编码的字节串(str类型),此时string是字节串,适配多数Python 2.7旧代码的要求
写法一无法运行的可能原因
- 变量名冲突:原代码将解析结果赋值给
json变量,直接覆盖了json模块,后续json['key']会抛出语法错误,需改为data = json.load(f) - 类型不匹配:若应用后续逻辑仅接受
str类型字节串,写法一得到的unicode字符串会触发UnicodeEncodeError
Python 2.7编码的关键误区
- 明确区分
str和unicode:str是字节序列,unicode是文本序列,操作时必须清楚当前是在做解码(字节→文本)还是编码(文本→字节) json模块的默认行为:处理字节流时自动按utf-8解码为unicode;处理Unicode流时直接解析。若JSON文件非utf-8编码,用open直接读取可能先触发解码失败codecs.open的作用:帮你完成「文件字节→Unicode文本」的解码步骤,而open仅返回字节串,需手动处理编码转换
内容的提问来源于stack exchange,提问作者IzaeDA
相关产品推荐
相关产品推荐

