Python Write UTF-8 Json Data to File
2075 ワード
Question
最近問題が発生しました.Mongoがエクスポートしたjsonファイルで、エディタで中国語を開くと正常に表示されます.しかし、私自身が直接ファイルに書き込むのは「u 4 f 60」という形です.
最後に印刷された値は中国語ではありません.
Method
2つの原因があるかもしれないと推測します. json dumpsが返す値は中国語 を含まないファイルを書き込むときにASCII形式 に変換する
第一に、テストしてみましょう.
あれ、この時点で値はASCII形式になっています.
Perfect! これが問題らしい.
上の推測の2点目は何の問題もない.
Extension
実は、
最近問題が発生しました.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つの原因があるかもしれないと推測します.
第一に、テストしてみましょう.
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'}