Python JSON保留编码

Python JSON保留编码,python,json,encoding,Python,Json,Encoding,我有这样一个文件: 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"

我有这样一个文件:

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
如果键与保存的键不相同,则无法查找字典

编辑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
这是正常有效的JSON行为。Python也使用转义符
\uxxx
,因此请确保不要将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ö
这是正常有效的JSON行为。Python也使用转义符
\uxxx
,因此请确保不要将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ö


您正在查看unicode字符的JSON编码。这是正常的。这是完全兼容的(请参阅第2.5节关于字符串值)。Json正确地保存了数据。Unicode字符串被转换为您提供的格式。但是当我再次加载它时,它不会像以前一样转换回去。@gcq:您确定您没有看到Python字符串文字表示吗?
>>打印u'h\xe9ll\xf6'
给出
héllö
。您看到的是python字符串文字表示。您的代码正在运行。您正在查看unicode字符的JSON编码。这是正常的。这是完全兼容的(请参阅第2.5节关于字符串值)。Json正确地保存了数据。Unicode字符串被转换为您提供的格式。但是当我再次加载它时,它不会像以前一样转换回去。@gcq:您确定您没有看到Python字符串文字表示吗?
>>打印u'h\xe9ll\xf6'
给出
héllö
。您看到的是python字符串文字表示。您的代码正常工作。@gcq:您正在打开一个文件,但没有指定编码。这是Python2还是Python3,你知道文件使用的是什么编码吗?@gcq:你需要给我们更多的细节,告诉我们你在做这件事时看到了什么(在输入和输出上使用
repr()
,给我们一个类似于我的回答中的Python会话,这样我们可以帮助你调试)。@Martjin是Python2,不是,我不知道此文件中使用的编码,但在从文件中写入和读取非ascii字符之前从未遇到过问题。@gcq:这就是我希望您执行的操作。:-)您可以很好地从文件中读取字节,但不会以这种方式获得unicode字符转义。@Martijin那么,我该如何从文件中检索json呢?我不能使用json.dump()和.load(),因为文件中的每一行都是一个json对象。要做到这一点,我需要在内存中加载大约88000个字典,我不想这样做。@gcq:您正在打开一个文件,但没有指定编码。这是Python2还是Python3,你知道文件使用的是什么编码吗?@gcq:你需要给我们更多的细节,告诉我们你在做这件事时看到了什么(在输入和输出上使用
repr()
,给我们一个类似于我的回答中的Python会话,这样我们可以帮助你调试)。@Martjin是Python2,不是,我不知道此文件中使用的编码,但在从文件中写入和读取非ascii字符之前从未遇到过问题。@gcq:这就是我希望您执行的操作。:-)您可以很好地从文件中读取字节,但不会以这种方式获得unicode字符转义。@Martijin那么,我该如何从文件中检索json呢?我不能使用json.dump()和.load(),因为文件中的每一行都是一个json对象。要做到这一点,我需要在内存中加载大约88000本字典,我不想这样做。