Python JSON 保持编码

1 投票
1 回答
1272 浏览
提问于 2025-04-17 17:45

我有一个这样的文件:

aarónico
aaronita
ababol
abacá
abacería
abacero
ábaco
#more words, with no ascii chars

当我读取这个文件并把内容打印到控制台时,输出和文件内容完全一样,这很正常。但是当我执行:

f.write(json.dumps({word: Lookup(line)}))

结果却保存成了这个:

{"aar\u00f3nico": ["Stuff"]}

而我原本期待的是:

{"aarónico": ["Stuff"]}

我希望在使用jason.loads()的时候能得到一样的结果,但我不知道该在哪里或者怎么进行编码,或者是否需要编码才能正常工作。

编辑

这是保存数据到文件的代码:

with open(LEMARIO_FILE, "r") as flemario:
    with open(DATA_FILE, "w") as f:
        while True:
            word = flemario.readline().strip()
            if word == "":
                break
            print word #this is correct
            f.write(json.dumps({word: RAELookup(word)}))
            f.write("\n")

而这段代码是用来加载数据并返回字典对象的:

    with open(DATA_FILE, "r") as f:
        while True:
            new = f.readline().strip()
            if new == "":
                break
            print json.loads(new) #this is not

如果字典的键和保存时的不一样,我就无法查找这些字典。

编辑 2

>>> import json
>>> f = open("test", "w")
>>> f.write(json.dumps({"héllö": ["stuff"]}))
>>> f.close()
>>> f = open("test", "r")
>>> print json.loads(f.read())
{u'h\xe9ll\xf6': [u'stuff']}
>>> "héllö" in {u'h\xe9ll\xf6': [u'stuff']}
False

1 个回答

6

这是正常且有效的JSON行为。\uxxxx这种转义方式在Python中也用到,所以要确保你不要把Python的字面表示和字符串的内容搞混。

在Python 3.3中的示例:

>>> import json
>>> print('aar\u00f3nico')
aarónico
>>> print(json.dumps('aar\u00f3nico'))
"aar\u00f3nico"
>>> print(json.loads(json.dumps('aar\u00f3nico')))
aarónico

在Python 2.7中的示例:

>>> import json
>>> print u'aar\u00f3nico'
aarónico
>>> print(json.dumps(u'aar\u00f3nico'))
"aar\u00f3nico"
>>> print(json.loads(json.dumps(u'aar\u00f3nico')))
aarónico

在读写文件时,以及当你只指定原始字节字符串时(比如"héllö"就是一个原始字节字符串),你并不是在处理Unicode数据。你需要先了解编码数据和Unicode数据之间的区别。我强烈建议你至少阅读以下三篇文章中的两篇:

你在处理"héllö"这个Python原始字节字符串时运气不错,Python自动帮你解码了。你从文件中读取的值是完全正常且正确的:

>>> print u'h\xe9ll\xf6'
héllö

撰写回答