Python JSON 保持编码
我有一个这样的文件:
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数据之间的区别。我强烈建议你至少阅读以下三篇文章中的两篇:
实用Unicode,作者是Ned Batchelder
每个软件开发者绝对必须知道的Unicode和字符集的最低限度知识(没有借口!),作者是Joel Spolsky
你在处理"héllö"
这个Python原始字节字符串时运气不错,Python自动帮你解码了。你从文件中读取的值是完全正常且正确的:
>>> print u'h\xe9ll\xf6'
héllö