python 之 json中文读写乱码问题

奋斗吧
奋斗吧
擅长邻域:未填写

标签: python 之 json中文读写乱码问题 博客 51CTO博客

2023-07-23 18:24:17 199浏览

python 之 json中文读写乱码问题,Python常见问题:json读写乱码

问题出现场景

一、读取json文件时(打印或者显示)

假设有个json文件,把文件内的内容print出来

{
  "cities": [
    {
      "city": "北京",
      "cityid": "101010100"
    },
    {
      "city": "上海",
      "cityid": "101020100"
    }
  ]
}

首先这么写:

def readJson():
    josnFile = open('someJson.json', 'rb')
    file = json.load(josnFile)
    data = json.dumps(file, indent=4)
    return data
print(readJson())

输出的内容如下:

{
    "cities": [
        {
            "city": "\u5317\u4eac",
            "cityid": "101010100"
        },
        {
            "city": "\u4e0a\u6d77",
            "cityid": "101020100"
        }
    ]
}

中文变成了Unicode编码了,由于dumps方法不会去修改json文件本身,我们给dumps加个参数看看 ensure_ascii=False 

data = json.dumps(file, indent=4, ensure_ascii=False)

输出正确的格式了:

python 之 json中文读写乱码问题_JSON

在上面的示例中,我们首先使用`json.load()`函数读取JSON文件中的数据,并对其进行修改。然后,我们使用`json.dump()`函数将修改后的数据保存回JSON文件中,并在保存时指定`ensure_ascii=False`参数以保留非ASCII字符的原始形式。

为什么呢?

这是因为json.dumps 序列化时对中文默认使用的ascii编码,想输出真正的中文需要指定ensure_ascii=False

二、修改json文件时

如果我想修改上面json文件中 北京的cityid,我会这么写:

def writeJson():
    with open('someJson.json', 'r') as file:
        data = json.load(file)
    # 修改 JSON 数据
    # 遍历 cities 列表
    for city in data['cities']:
        if city['city'] == '北京':
            # 修改 cityid
            city['cityid'] = '12345678'
    # 写入修改后的 JSON 数据到文件
    with open('someJson.json', 'w') as file:
        json.dump(data, file, indent=4)

结果是这样的,我的json又变成乱码了,而且,北京的cityid也没有修改成功:

{
    "cities": [
        {
            "city": "\u9356\u693e\u542b",
            "cityid": "101010100"
        },
        {
            "city": "\u6d93\u5a43\u6363",
            "cityid": "101020100"
        }
    ]
}

跟第一个场景一样,加个参数试试:json.dump(data, file, indent=4, ensure_ascii=False),结果乱码消失了,但是cityid还是没有修改成功。。。。

通过断点调试发现:

python 之 json中文读写乱码问题_python_02

city不知道为什么又变成了乱码,也就是我们解析的时候不能匹配到“北京”的cityid,自然就改不到cityid的值了

为什么是乱码,不是unicode编码呢?

可能是由于文件的编码方式不正确导致的。在保存文件时,可以指定正确的编码方式来解决这个问题:

def writeJson():
    with open('someJson.json', 'r', encoding='utf-8') as file:
        data = json.load(file)
    # 修改 JSON 数据
    # 遍历 cities 列表
    for city in data['cities']:
        if city['city'] == '北京':
            # 修改 cityid
            city['cityid'] = '12345678'
    # 写入修改后的 JSON 数据到文件
    with open('someJson.json', 'w', encoding='utf-8') as file:
        json.dump(data, file, indent=4, ensure_ascii=False)

在读取JSON文件时使用encoding='utf-8'参数来指定文件的编码方式为UTF-8(不一定是utf-8编码,可能是gbk等 可以用文本编辑器查看文件编码)。然后,在保存JSON文件时也使用相同的编码方式。通过保持读取和保存文件时的编码方式一致,可以避免出现乱码的问题、最终修改成功:

python 之 json中文读写乱码问题_JSON_03



好博客就要一起分享哦!分享海报

此处可发布评论

评论(0展开评论

暂无评论,快来写一下吧

展开评论

您可能感兴趣的博客

客服QQ 1913284695