Python JSON加载设置编码为UTF-8

55

我有这段代码:

keys_file = open("keys.json")
keys = keys_file.read().encode('utf-8')
keys_json = json.loads(keys)
print(keys_json)

keys.json 中存在一些非英文字符。但是结果却如下所示:

[{'category': 'мбт', 'keys': ['Блендер Philips',
'мультиварка Polaris']}, {'category': 'КБТ', 'keys':
['холод ильник атлант', 'посудомоечная
машина Bosch']}]

我该怎么办?


1
我想将它们显示为普通语言,而不是一堆难以理解的符号列表。 - user2950593
@StefanPochmann 这是个错误。已经纠正了。 - user2950593
encode 意味着将字符转换为二进制。当你在 读取 文件时,你需要进行 二进制到字符 的转换 → decode - deceze
@deceze 解码不是自动完成的吗? - Stefan Pochmann
1
@Stefan 好的,这里稍微有点倒退。默认情况下它是被解码的,是的。它取决于它被解码为什么(无论locale.getpreferredencoding()返回什么)是我应该说的。此外,我并不是真正主张OP调用decode,我想指出他们一开始就在做逻辑上错误的操作。 - deceze
显示剩余7条评论
1个回答

135

编码是将字符转化为二进制的过程。当你读取一个文件时,想要的是二进制转化为字符的过程,即解码。但实际上整个过程太过繁琐,只需这样做:

with open('keys.json', encoding='utf-8') as fh:
    data = json.load(fh)

print(data)
< p > with 处理文件的正确打开和关闭,open 函数中的 encoding 参数确保以正确的编码读取文件,load 函数直接从文件句柄读取而不是先将文件内容存储在内存中。

如果仍然输出无效字符,则意味着您的源编码不是 UTF-8 或您的控制台/终端无法处理 UTF-8。


1
fh 代表什么? - user2950593
3
“文件句柄”这个名词可以替换为任何你想要的名字。与“keys_file”相比,它更具描述性。此外,请注意,“data”比“keys_json”更适当作为名称;当你加载了JSON数据之后,它已经不再是JSON格式,而是Python中的列表/字典。 - deceze
3
你如何在 Python 2 中实现这个? - Priyansh Agrawal
@Akbar load 从文件指针读取,效率高。loads 从字符串读取,如果您先将文件读入内存,然后再将其解析为字符串,则效率较低。 - deceze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接