json和编码字符串

Mel*_*oun 1 python encoding json

我有这个字符串列表..

mylist = [u"?eština", u"ma?arština", u"francouština"]
Run Code Online (Sandbox Code Playgroud)

我需要将其转储到一个文件中,我正在使用JSON

text = json.dumps(mylist)
FILE = open("file.txt", 'w')
FILE.write(text)
FILE.close()
Run Code Online (Sandbox Code Playgroud)

但是当我在编辑器中打开文件时(使用utf-8)我明白了

["\u010de\u0161tina", "ma\u010far\u0161tina", "francou\u0161tina"]
Run Code Online (Sandbox Code Playgroud)

当我从文件中读取列表时,我得到正确的值.但是这个文件也应该是用户油炸的,我也期待..

["?eština", "ma?arština", "francouština"]
Run Code Online (Sandbox Code Playgroud)

或至少

[u"?eština", u"ma?arština", u"francouština"]
Run Code Online (Sandbox Code Playgroud)

And*_*ark 6

当你这样做时,json.dumps([u"?eština", u"ma?arština", u"francouština"])你将获得字符串'["\\u010de\u0161tina", "ma\\u010far\u0161tina", "francou\\u0161tina"]'(使用有效的Python字符串文字形式).该\u逃逸是Unicode的是如何在JSON表示,为Unicode转义默认Python的JSON模块将转换所有非ASCII字符.您可以通过ensure_ascii=False在json.dumps()参数中使用来禁用此行为.

以下是一些示例,首先是默认行为:

>>> json.dumps(lst)
'["\\u010de\\u0161tina", "ma\\u010far\\u0161tina", "francou\\u0161tina"]'
>>> print json.dumps(lst)
["\u010de\u0161tina", "ma\u010far\u0161tina", "francou\u0161tina"]
Run Code Online (Sandbox Code Playgroud)

并与ensure_ascii=False:

>>> json.dumps(lst, ensure_ascii=False)
u'["\u010de\u0161tina", "ma\u010far\u0161tina", "francou\u0161tina"]'
>>> print json.dumps(lst, ensure_ascii=False)
["?eština", "ma?arština", "francouština"]
Run Code Online (Sandbox Code Playgroud)

现在要确保使用utf-8编写此Unicode字符串,您可以使用编解码器模块:

import codecs, json
lst = [u"?eština", u"ma?arština", u"francouština"]
json.dump(lst, codecs.open('file.txt', 'w', 'utf-8'), ensure_ascii=False)
Run Code Online (Sandbox Code Playgroud)

请注意,我还使用了json.dump()直接写入文件而不是json.dumps().