python json文档读写(含有汉子中文)

本文介绍了一个Python脚本,用于批量修改文件夹中JSON文件的数据结构。具体操作为将'obj_points'字典中的'width'和'height'键名分别替换为'w'和'h',实现对图像标注数据的格式调整。
import os
import json

json_folder_old = './labels_old'
json_folder_new = './labels'

num = 1
for filename in os.listdir(json_folder_old):
    json_path_old = os.path.join(json_folder_old, filename)
    json_path_new = os.path.join(json_folder_new, filename)
    print(json_path_old , '   ', num)
    with open(json_path_old, 'rb') as f_load:
        f_dir = json.load(f_load)
        # print(f_dir, '\n')
        for obj in f_dir['objects']:
            # print(obj)
            obj_points = obj['obj_points'] # 列表
            obj_points = obj_points[0]
            # print(obj_points)
            obj_points["w"] = obj_points.pop("width")
            obj_points["h"] = obj_points.pop("height")
            # print(obj_points)

    with open(json_path_new, 'w', encoding='utf-8') as f_dump:
        json.dump(f_dir, f_dump,ensure_ascii=False)

    num += 1

<think> 我们被要求提供一个Python读写JSON文件的推荐方法。根据引用[1]和[2],我们可以看到核心方法是使用json模块的dump和load函数进行文件读写,以及dumps和loads进行字符串转换。 同时,我们需要注意中文字符的处理(使用ensure_ascii=False)和格式化输出(使用indent参数)。 另外,引用[2]还提到了数据类型映射关系,引用[4]则展示了一个JSON文件读取的示例。 因此,我们将按照以下结构回答: 1. 导入json模块 2. 写入JSON文件(使用json.dump,并说明参数ensure_ascii和indent) 3. 读取JSON文件(使用json.load) 4. 数据类型映射(简要说明) 5. 附加技巧:字符串与对象的转换(json.dumps和json.loads) 注意:我们还需要在回答末尾生成相关问题,并添加引用标记。 </think> ### Python读写JSON文件的推荐方法 Python通过内置`json`模块提供完整的JSON处理能力,以下是经过优化的推荐实践: #### 1. **基础读写操作** ```python import json # ▶ 写入JSON文件(推荐格式) data = {"姓名": "张三", "成绩": [92, 85, 78], "状态": True} with open("data.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, # 保留非ASCII字符 indent=2) # 缩进美化 # ▶ 读取JSON文件 with open("data.json", "r", encoding="utf-8") as f: loaded_data = json.load(f) print(loaded_data["姓名"]) # 输出: 张三 ``` > **关键参数说明**: > - `ensure_ascii=False`:正确处理中文等非ASCII字符[^1] > - `indent=2`:生成易读的格式化文件(生产环境可省略节省空间) #### 2. **数据类型处理技巧 ```python # 特殊类型处理(日期/自定义类) from datetime import datetime class Student: def __init__(self, name): self.name = name def enhanced_encoder(obj): if isinstance(obj, datetime): return obj.strftime("%Y-%m-%d") # 日期格式化 elif isinstance(obj, Student): return {"student_name": obj.name} # 自定义类转换 raise TypeError("不可序列化对象") # 使用自定义编码器 data = {"time": datetime.now(), "stu": Student("李四")} json_str = json.dumps(data, default=enhanced_encoder, ensure_ascii=False) ``` #### 3. **大文件内存优化 ```python # 流式处理大型JSON文件 with open("big_data.json", "r", encoding="utf-8") as f: # 逐行解析避免内存溢出 for line in f: item = json.loads(line) process(item) # 逐项处理 ``` #### 4. **格式转换对照表 | **操作类型** | **推荐方法** | **使用场景** | |----------------|--------------------|----------------------------------| | 字典→文件 | `json.dump()` | 数据持久化存储 | | 文件→字典 | `json.load()` | 读取配置文件/API响应 | | 对象→字符串 | `json.dumps()` | 网络传输或日志记录 | | 字符串→对象 | `json.loads()` | 解析API响应或消息队列数据 | > **最佳实践**: > 1. 始终指定文件编码:`encoding='utf-8'` > 2. 生产环境关闭缩进:`indent=None` > 3. 使用`try-except`处理格式错误: > ```python > try: > data = json.load(f) > except json.JSONDecodeError as e: > print(f"JSON解析错误: {e}") > ``` #### 5. **性能优化技巧 - **序列化加速**:使用`ujson`库(需安装)替代`json`模块 - **大数据处理**:结合`ijson`库实现增量解析 - **压缩存储**: ```python import gzip with gzip.open("data.json.gz", "wt", encoding="utf-8") as f: json.dump(data, f) # 压缩率可达70-90% ``` JSON作为轻量级数据交换格式,配合Python的`json`模块可实现高效跨平台数据交互,适用于配置文件、API通信和数据处理管道等场景[^1][^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值