Python实现CSV转JSON:如何去除输出中多余的方括号
问题:CSV转JSON时topic字段多余方括号的去除
经过大量调试,我编写的代码已能将CSV转换为所需的JSON输出,但输出中topic字段存在不必要的方括号,需去除才能适配目标程序。以下是相关信息:
CSV样本
insert_topic,Academic Program,class | classroom | (course materials)~3.... insert_topic,Academic Quality,"((learning outcomes)~3 | (learning expectations)~3 ) | learning ... insert_topic,Academic Support,(available teacher)~3 | (available faculty)~3...
现有代码
import csv import json from itertools import groupby csvfile = open('TIQ_dict_topics.csv', 'r').readlines() jsonfile = open('Topics.json', 'w') r = csv.DictReader(csvfile) data = [dict(d) for d in r] groups = [] for k, g in groupby(data, lambda r: (r['label'], r['operation'])): groups.append({ "operation": k[1], "topic": [{k: v for k, v in d.items() if k not in ['operation']} for d in list(g)] }) out=json.dumps(groups[:], indent=4) jsonfile.write(out)
当前问题输出
当前输出中topic字段被不必要的方括号包裹,示例如下:
[ { "operation": "insert_topic", "topic": [ { "label": "Academic Program", "query": "lots here..." } ] } ]
请问是代码的哪部分导致了这些方括号?能否在不重写全部代码的前提下去除它们?我此前尝试过多种CSV转JSON方案,这是最接近需求结构的,且我对JSON的使用经验较少。
解答
问题根源
代码中topic字段的值由列表推导式生成:[{k: v...} for d in list(g)],这会创建一个包含字典的列表,所以输出里会有方括号。结合你的分组逻辑(用(label, operation)作为分组键),每个分组里只有一行数据,因此这个列表仅包含一个字典。
修改方案
无需重写全部代码,只需要把生成列表的逻辑改成直接取分组内的单个字典即可,有两种简洁的修改方式:
方式1:使用next()直接获取分组元素(更高效)
import csv import json from itertools import groupby csvfile = open('TIQ_dict_topics.csv', 'r').readlines() jsonfile = open('Topics.json', 'w') r = csv.DictReader(csvfile) data = [dict(d) for d in r] groups = [] for k, g in groupby(data, lambda r: (r['label'], r['operation'])): # 直接获取分组中的第一个元素并处理,避免生成列表 topic_dict = next({key: val for key, val in item.items() if key != 'operation'} for item in g) groups.append({ "operation": k[1], "topic": topic_dict }) out=json.dumps(groups[:], indent=4) jsonfile.write(out)
方式2:转列表后取第一个元素(更直观)
import csv import json from itertools import groupby csvfile = open('TIQ_dict_topics.csv', 'r').readlines() jsonfile = open('Topics.json', 'w') r = csv.DictReader(csvfile) data = [dict(d) for d in r] groups = [] for k, g in groupby(data, lambda r: (r['label'], r['operation'])): group_items = list(g) # 取列表第一个元素处理 topic_dict = {key: val for key, val in group_items[0].items() if key != 'operation'} groups.append({ "operation": k[1], "topic": topic_dict }) out=json.dumps(groups[:], indent=4) jsonfile.write(out)
修改后输出示例
[ { "operation": "insert_topic", "topic": { "label": "Academic Program", "query": "lots here..." } } ]
补充说明
- 两种方式都能去掉
topic外的方括号,next()方式无需将分组转成完整列表,性能更优; - 该修改基于你的分组逻辑:每个
(label, operation)组合仅对应一行CSV数据,若后续分组出现多行数据,需根据需求调整逻辑(比如保留列表或合并字段)。
内容的提问来源于stack exchange,提问作者Anna Harvey
相关产品推荐
相关产品推荐

