Python Write UTF-8 Json Data to File

2075 ワード

Question
最近問題が発生しました.Mongoがエクスポートしたjsonファイルで、エディタで中国語を開くと正常に表示されます.しかし、私自身が直接ファイルに書き込むのは「u 4 f 60」という形です.
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
2つの原因があるかもしれないと推測します.
  • json dumpsが返す値は中国語
  • を含まない
  • ファイルを書き込むときに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! これが問題らしい.
    上の推測の2点目は何の問題もない.
    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'}