为何用with open读JSON时‘rb’可用,写JSON时‘wb’却报错?
JSON文件读写模式差异的原因解析
读取时'r'和'rb'结果一致的原因
json.load() 函数对不同模式打开的文件对象做了兼容处理:
- 用文本模式(
'r')打开文件时,文件返回字符串,json.load()直接解析该字符串; - 用二进制模式(
'rb')打开文件时,文件返回字节数据,json.load()会自动按JSON默认的UTF-8编码将字节解码为字符串后再解析。
两种模式最终的解析结果完全相同,所以你会看到一致的输出。
写入时'wb'报错、'w'正常的原因
json.dump() 默认会把Python对象序列化为字符串:
- 用
'w'(文本模式)打开文件时,文件对象接受字符串输入,会自动按默认编码(通常为UTF-8)将字符串转为字节写入磁盘,因此运行正常; - 用
'wb'(二进制模式)打开文件时,文件对象仅接受字节类型的数据,但json.dump()输出的是字符串,类型不匹配,就会抛出:
TypeError: a bytes-like object is required, not 'str'
如果一定要用二进制模式写入,可以先通过json.dumps()将对象转为字符串,再手动编码为字节写入,示例代码:
import json some_dict = {"key": "value"} with open('something.json', 'wb') as f: json_str = json.dumps(some_dict) f.write(json_str.encode('utf-8'))
内容的提问来源于stack exchange,提问作者Yandle
相关产品推荐
相关产品推荐

