Python Write UTF-8 Json Data to File

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

我猜测有两处可能有两处原因。

  1. json dumps返回的值不包含中文
  2. 写入文件的时候转换成了ASCII形式

针对第一点,我们来测试一下。

import json

d = {'你好': 'Python3'}
b = json.dumps(d)
print(b)
{"\u4f60\u597d": "Python3"}

咦,这个时候值已经变成了ASCII形式。猜想是不是dumps的时候做了转换。这样的话我们需要看一下dumps的实现。

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'}
    原文作者:Syfun
    原文地址: https://www.jianshu.com/p/1717b906acf8
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞