2013-03-03 60 views
1

我有一个这样的文件: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") 

而这一次加载数据并返回Dictionary对象:

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

我如果密钥与保存的不一致,则无法查找字典。

EDIT 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

您正在查看unicode字符的JSON编码。 *这很正常*。这完全符合[RFC 4627 JSON](http://www.ietf.org/rfc/rfc4627.txt?number=4627)(关于字符串值,请参阅第2.5节)。 – 2013-03-03 10:17:24

+0

Json正在保存数据。 Unicode字符串将转换为您提供的格式。 – 2013-03-03 10:17:42

+0

但是当我再次加载它时,它会转回原来的状态。 – gcq 2013-03-03 10:18:44

回答

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数据之间的差异。我强烈建议您阅读以下3个项目的至少2:

你很幸运,你的"héllö" python原始字节字符串表示,Python设法自动为您解码。从文件中读回的值是完全正常和正确的:

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

我编辑了我的问题 – gcq 2013-03-03 10:35:31

+0

@gcq:您正在打开一个文件,但未指定编码。这是Python 2或3,你知道*文件使用什么编码? – 2013-03-03 10:41:26

+0

@gcq:你需要给我们更多的细节*,当你这样做时你会看到什么(在输入和输出中使用'repr()',给我们一个Python会话,例如我的回答,所以我们可以帮助你调试)。 – 2013-03-03 10:46:40