Question
最近遇到個問題,在Mongo導出的json文件里, 用編輯器打開中文是可以正常顯示的匕荸。但是我自己直接寫入文件中卻是"\u4f60"這樣的形式核芽。
import json
d = {'你好': 'Python3'}
with open('out.json', 'w') as f:
f.write(json.dumps(d))
with open('out.json', 'r') as f:
print(f.read())
{"\u4f60\u597d": "Python3"}
最后打印的值并不是中文耘斩。
Method
我猜測有兩處可能有兩處原因惫恼。
- json dumps返回的值不包含中文
- 寫入文件的時候轉換成了ASCII形式
針對第一點,我們來測試一下琳骡。
import json
d = {'你好': 'Python3'}
b = json.dumps(d)
print(b)
{"\u4f60\u597d": "Python3"}
咦锅论,這個時候值已經變成了ASCII形式。猜想是不是dumps
的時候做了轉換楣号。這樣的話我們需要看一下dumps
的實現(xiàn)最易。
def dumps(obj, *, skipkeys=False, ensure_ascii=True, check_circular=True,
allow_nan=True, cls=None, indent=None, separators=None,
default=None, sort_keys=False, **kw):
If ``ensure_ascii`` is false, then the return value can contain non-ASCII
characters if they appear in strings contained in ``obj``. Otherwise, all
such characters are escaped in JSON strings.
如果ensure_ascii
是false怒坯,返回值才能包含非ASCII字符。
import json
d = {'你好': 'Python3'}
with open('out.json', 'w') as f:
f.write(json.dumps(d, ensure_ascii=False))
with open('out.json', 'r') as f:
print(f.read())
{'你好': 'Python3'}
Perfect! 看來這就是問題所在藻懒。
上面猜測的第二點并沒有什么問題剔猿。
Extension
其實,除了dumps
之外嬉荆,寫入文件我們還可以用更簡單的dump
方法归敬,同樣需要ensure_ascii=False
。
import json
d = {'你好': 'Python3'}
with open('out.json', 'w') as f:
json.dump(d, f, ensure_ascii=False)
with open('out.json', 'r') as f:
print(f.read())
{'你好': 'Python3'}