You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 21:10:27