python json.dump() 无法正确写入中文的解决办法

python中的 json 库可以很方便地将字典对象写入到文件中,或者从文件中直接读取成为字典对象。

但是如果字典中有中文数据(或者其它 非ascii字符),写入的时候会被强行转义,比如下面的代码:

import json

dict_zh = {
    '键': '值',
    '多重字典': {
        'name': 'can',
        'city': 'Canton'
    }
}

with open("json/test.json", 'w+') as f1:
    json.dump(dict_zh, f1)

写入到test.json文件的实际内容会是这样的:

{"\u952e": "\u503c", "\u591a\u91cd\u5b57\u5178": {"name": "can", "city": "Canton"}}

其中的中文字符都被转义了,转义方式等同于:

print("键".encode("unicode_escape"))

上面这行的输出为:

b'\\u952e'

如果继续用 json.load(file_object) 从上面的 test.json 读取,也是能读出来正确的中文字符的。毕竟不是 python 不支持中文,只是 json.dump 这个方法默认把中文转义再输出了而已。

而要关闭这个转义,也只要在使用 json.dump 的时候,指定一个关键词参数 就可以。

json.dump(objfp*skipkeys=Falseensure_ascii=Truecheck_circular=Trueallow_nan=Truecls=Noneindent=Noneseparators=Nonedefault=Nonesort_keys=False**kw)

其中的 ensure_ascii 默认为 True,表示会将所有输入的非 ASCII 字符转义。只要改成 False 就可以。于是代码更改为如下:

import json

dict_zh = {
    '键': '值',
    '多重字典': {
        'name': 'can',
        'city': 'Canton'
    }
}

with open("json/test.json", 'w+') as f1:
    json.dump(dict_zh, f1, ensure_ascii=False)

运行结果,test.json 的内容变成:

{"键": "值", "多重字典": {"name": "can", "city": "Canton"}}

OK,搞定。

 

 

你可能感兴趣的:(python,json)