美文网首页
Python Write UTF-8 Json Data to

Python Write UTF-8 Json Data to

作者: Syfun | 来源:发表于2017-08-08 20:21 被阅读599次

    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'}
    

    相关文章

      网友评论

          本文标题:Python Write UTF-8 Json Data to

          本文链接:https://www.haomeiwen.com/subject/ymjxrxtx.html