python将数据保存为json文件时,打开json文件里面的中文发现是unicode码

本文解决了一个常见问题:如何在使用Python的json.dump方法保存包含中文的字典到json文件时,避免中文被转换为unicode码。关键在于设置ensure_ascii参数为False。

最近要将爬取的数据通过json.dump处理后保存成json文件,程序一切运行正常,但是打

开保存之后的json文件发现除了字母,原来的字典数据里面的中文全部变成了unicode

码,像下面这个样子
在这里插入图片描述
噢,这真是一个令人悲伤的故事。。。。

然后在网上找了几个方法,经尝试之后,发现都不行,哈哈哈

后来发现了这个老哥的博客,讲的非常详细!!!!

    try:
        with open(jsonfile,'w',encoding = 'utf-8') as jfile:
        	#即添加参数 ensure_ascii=False,它默认的是Ture
            json.dump(list_all_pages,jfile,ensure_ascii=False,indent = 4)

总结一下:

1、python3里面默认编码是unicode

2、做dump与dumps操作时,会默认将中文转换为unicode,但在做逆向操作load和loads时会转换为中文,但是中间态(例如存储的json文件)的中文编码方式仍然是unicode

解决办法:
在dump里面添加ensure_ascii=False

参考:
https://blog.youkuaiyun.com/firefox1/article/details/78331369
https://blog.youkuaiyun.com/u014519194/article/details/53927149

<think>好的,我现在需要帮助用户解决如何将Python字典保存JSON文件的问题。用户已经提供了几个引用,里面提到了不同的方法,比如使用json.dump和json.dumps,还提到了格式化写入和中文处理。我需要综合这些信息,并结合用户之前的提问来给出一个全面的回答。 首先,用户之前的问题是关于如何往字典中添加另一个字典的键值对,现在转向如何将字典保存JSON。我需要确保回答的结构清晰,分步骤说明,同覆盖用户提到的格式化写入和中文字符处理。 接下来,我需要参考用户提供的引用。引用[1]和[4]提到了使用json.dump并设置indent和ensure_ascii=False来处理格式和中文显示。引用[2]则使用了json.dumps然后写入文件,而引用[3]展示了批量生成JSON文件的例子。这些方法都需要在回答中涵盖。 用户的需求是保存字典为JSON,并且格式化写入。所以,我应该先介绍最常用的方法,即使用json.dump直接写入文件,并解释参数indent和ensure_ascii的作用。然后,再提到json.dumps的方法,虽然两者效果相似,但使用场景可能不同。此外,用户提到中文显示的问题,需要强调ensure_ascii=False的重要性。 另外,用户可能需要处理文件路径的问题,比如如何指定目录,引用[3]中使用了os.path.join来构建路径,这个点也值得提及。还有,如果用户需要将多个字典保存到不同的文件,或者处理嵌套结构,可能需要额外的示例,但根据当前问题,可能暂不需要,但可以放在相关问题里。 我还需要检查是否有其他注意事项,比如文件打开编码方式(utf-8),这在引用[4]中提到了,这也是处理中文的关键点。同,错误处理,比如文件不存在的异常捕获,可能用户没有提到,但作为最佳实践,是否需要包含?用户的问题比较基础,可能不需要太复杂的错误处理,但可以简要提到。 最后,生成相关问题,引导用户进一步学习,比如如何处理嵌套字典、合并多个JSON文件或者读取JSON数据,这些都是用户可能感兴趣的后续问题。 现在需要组织这些内容,确保步骤清晰,代示例正确,并标注引用来源。同,保持回答的中文,符合用户要求。</think>以下是Python将字典保存JSON文件的完整实现方案,包含格式化写入、中文支持和注意事项: --- ### **基础方法:直接写入JSON文件** ```python import json data = { "姓名": "张三", "年龄": 25, "技能": ["Python", "数据分析"] } # 核心写入操作 with open('data.json', 'w', encoding='utf-8') as f: json.dump(data, f, indent=4, # 缩进格式化 ensure_ascii=False) # 支持中文显示[^4] ``` --- ### **进阶方案:多场景实现** #### **场景1:批量保存多个字典** ```python import os import json datasets = { "user_001": {"name": "李四", "score": 89}, "user_002": {"name": "王五", "score": 92} } output_dir = "json_files" os.makedirs(output_dir, exist_ok=True) # 自动创建目录 for user_id, user_data in datasets.items(): file_path = os.path.join(output_dir, f"{user_id}.json") # 动态路径[^3] with open(file_path, 'w', encoding='utf-8') as f: json.dump(user_data, f, indent=2, ensure_ascii=False) ``` #### **场景2:增量追加数据** ```python existing_data = {} try: with open('log.json', 'r', encoding='utf-8') as f: existing_data = json.load(f) except FileNotFoundError: pass new_data = {"timestamp": "2023-08-01", "event": "系统启动"} existing_data.update(new_data) with open('log.json', 'w', encoding='utf-8') as f: json.dump(existing_data, f, indent=4, ensure_ascii=False) ``` --- ### **关键参数说明** | 参数 | 作用 | 推荐值 | |-------------------|-----------------------------|---------------| | `indent` | 缩进空格数(0为压缩格式) | 2或4 | | `ensure_ascii` | 是否转换非ASCII字符 | False(显示中文) | | `sort_keys` | 按键名字典序排序 | True/False | | `separators` | 控制分隔符样式 | (',', ': ') | --- ### **特殊格式处理技巧** #### **处理日期间对象** ```python from datetime import datetime class CustomEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime): return obj.isoformat() return super().default(obj) data = {"create_time": datetime.now()} with open('time_data.json', 'w') as f: json.dump(data, f, cls=CustomEncoder, indent=4) ``` #### **保留原始数据顺序(Python 3.7+)** ```python import collections ordered_data = collections.OrderedDict([ ('z', 26), ('a', 1), ('m', 13) ]) with open('ordered.json', 'w') as f: json.dump(ordered_data, f, indent=4) ``` --- ### **性能优化建议** 1. **大文件处理**:使用`ijson`库流式处理GB级JSON 2. **压缩存储**:结合`gzip`模块 ```python import gzip with gzip.open('big_data.json.gz', 'wt', encoding='utf-8') as f: json.dump(large_data, f) ``` --- ### **验证写入结果** ```python # 重新加载验证数据一致性 with open('data.json', 'r', encoding='utf-8') as f: reloaded = json.load(f) print(reloaded == data) # 应输出True ``` --- ### **常见问题排查** | 现象 | 解决方案 | |----------------------|--------------------------| | 中文显示为Unicode编码 | 检查`ensure_ascii=False`参数[^4] | | 文件内容全部在一行 | 添加`indent`参数 | | 特殊类型无法序列化 | 自定义JSONEncoder | | 权限错误 | 检查文件是否被其他程序占用 | ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值