Python实现CSV转指定格式JSON:添加编号键并改为对象结构
问题:将CSV转换为带编号键的JSON对象结构
我是Python新手,想把下面的CSV文件:
1.0,100.0,303.0,619.0,figure 338.0,162.0,143.0,423.0,text 85.0,768.0,554.0,39.0,text 504.0,164.0,24.0,238.0,subtitle 120.0,727.0,182.0,13.0,caption 540.0,165.0,62.0,428.0,title 614.0,163.0,23.0,133.0,tagline 317.0,629.0,113.0,113.0,figure 443.0,629.0,112.0,113.0,figure 568.0,628.0,121.0,114.0,figure
转换成如下格式的JSON:
{ "record_01": { "x": "1.0", "y": "100.0", "width": "303.0", "height": "619.0", "tag": "figure" }, "record_02": { "x": "338.0", "y": "162.0", "width": "143.0", "height": "423.0", "tag": "text" }, "record_03": { "x": "85.0", "y": "768.0", "width": "554.0", "height": "39.0", "tag": "text" }, // ... 以此类推 }
当前我的代码是:
import csv import json def convert_json(csvPath, jsonPath): fieldnames = ["x", "y", "width", "height", "tag"] with open(csvPath, "r", encoding="utf-8") as csvFile: csvReader = csv.DictReader(csvFile, fieldnames) data = [] for rows in csvReader: data.append(rows) with open(jsonPath, "w", encoding="utf-8") as jsonFile: jsonFile.write(json.dumps(data, indent=4))
现在输出的是JSON数组(用中括号包裹),但我需要输出对象结构(大括号包裹),并且每个条目要有带两位编号的record_xx键。我试过把data改成字典,但没法用append方法,该怎么修改?
解决方案
核心是将存储数据的容器从列表改为字典,通过序号生成指定格式的键名,把每行数据对应存入字典。修改后的代码如下:
import csv import json fieldnames = ["x", "y", "width", "height", "tag"] def convert_json(csvPath, jsonPath): with open(csvPath, "r", encoding="utf-8") as csvFile: csvReader = csv.DictReader(csvFile, fieldnames) data = {} # 用enumerate从1开始计数,生成两位补零的编号键 for record_num, row in enumerate(csvReader, start=1): data[f"record_{record_num:02d}"] = row with open(jsonPath, "w", encoding="utf-8") as jsonFile: json.dump(data, jsonFile, indent=4) csvPath = "data.csv" jsonPath = "data.json" convert_json(csvPath, jsonPath)
关键修改说明:
- 替换数据容器:把
data = []改为data = {},因为目标JSON是键值对结构的对象,而非数组 - 生成编号键:使用
enumerate(..., start=1)获取从1开始的行号,通过f"record_{record_num:02d}"生成带两位补零的键名(比如1→record_01,10→record_10) - 字典赋值替代列表append:直接通过
data[key] = row将每行数据存入字典,这是字典添加键值对的标准方式 - 简化写入操作:用
json.dump直接将字典写入文件,比json.dumps转成字符串后再写入更简洁高效
内容的提问来源于stack exchange,提问作者sabo97
相关产品推荐
相关产品推荐

