使用Python将含CSV格式字段的JSON转为结构化可读JSON并保留值类型
解决方案
1. 更优雅的实现方式
你可以直接用Python标准库自带的csv.DictReader省去手动拼接字典的逻辑,同时抽离公共转换函数适配多字段批量处理,核心优化点如下:
- 用
csv.DictReader直接将CSV每行转换为以表头为key的字典结构,无需手动拆分表头和内容做zip拼接 - 抽离CSV转换逻辑为独立函数,后续新增需要转换的字段仅需修改目标字段列表即可,无需重复编码
- 用
StringIO包装CSV字符串,适配csv模块的输入要求,避免手动处理换行符带来的异常
2. 字符串类型自动转原生类型方案
使用ast模块的literal_eval方法即可解决类型问题,该方法可以安全地将字符串形式的int、float、列表、元组等Python字面量转换为对应原生类型,遇到无法转换的普通字符串也可以做兼容处理,不会报错。
相比直接用eval,literal_eval仅会解析字面量结构,不会执行任意代码,安全性更高,完全适配你当前的场景。
完整可运行代码
import json import ast import csv from io import StringIO # 类型转换辅助函数 def convert_value(val: str): try: return ast.literal_eval(val) except (ValueError, SyntaxError): # 无法转换为字面量的内容保留原字符串 return val # CSV字符串转结构化列表函数 def csv_str_to_struct(csv_str: str): reader = csv.DictReader(StringIO(csv_str)) return [ {key: convert_value(value) for key, value in row.items()} for row in reader ] if __name__ == "__main__": # 读取源JSON文件 with open("test.json", "r", encoding="utf-8") as f: source_data = json.load(f) # 定义需要转换的CSV字段列表,新增字段直接追加到列表即可 TARGET_FIELDS = ["levelConfigList", "profitConfigList"] # 批量转换目标字段 inner_data = source_data["data"]["data"] for field in TARGET_FIELDS: if field in inner_data: inner_data[field] = csv_str_to_struct(inner_data[field]) # 输出转换结果(如果需要写入文件,替换print为json.dump即可) print(json.dumps(source_data, indent=4, ensure_ascii=False))
内容的提问来源于stack exchange,提问作者chapayev
相关产品推荐
相关产品推荐

