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

JSON转CSV失败求助:新手解析JSON生成可读CSV遇问题

解决JSON转CSV时出现单个字母拆分的问题

看起来你遇到的核心问题有两个:一是代码里把字符串当成可迭代列表遍历,导致每个字符被拆成单独的CSV列;二是你的JSON是嵌套结构,直接写入无法生成易读的表格。我来一步步帮你解决:

问题根源分析

你写的这段代码:

f = csv.writer(open('data.csv', 'w+', encoding='utf-8', newline=''))
for item in json_head:
    f.writerow(item)

这里的json_head应该是一个字符串(比如"data included links meta"),所以当你用for item in json_head时,Python会把字符串拆成单个字符,writerow(item)就把每个字符作为一列写入,最终CSV里就出现了d,a,t,a这种情况。

另外,你的JSON是嵌套结构(比如data下还有attributes),CSV是二维表格,必须先把嵌套的键值对展开才能生成易读的内容。

完整解决方案

步骤1:导入必要模块

首先需要json模块加载JSON数据,csv模块处理CSV写入:

import json
import csv

步骤2:编写扁平化嵌套JSON的函数

这个函数会把嵌套的字典展开成父键.子键的形式,比如data.attributes.createdAt,让CSV的列名清晰易懂:

def flatten_dict(d, parent_key='', sep='.'):
    items = []
    for k, v in d.items():
        new_key = f"{parent_key}{sep}{k}" if parent_key else k
        if isinstance(v, dict):
            # 如果值是字典,递归扁平化
            items.extend(flatten_dict(v, new_key, sep=sep).items())
        else:
            items.append((new_key, v))
    return dict(items)

步骤3:处理单个JSON条目

如果你的JSON是单个对象(比如你给出的模板结构),可以这样处理:

# 加载JSON数据(如果是本地文件,替换成 json.load(open('your_input.json', 'r', encoding='utf-8')))
json_data = {
  "data": {
    "type": "string",
    "id": "string",
    "attributes": {
      "createdAt": "string",
      "duration": 120
    }
  },
  "included": [],
  "links": {
    "self": "/example"
  },
  "meta": {
    "total": 10
  }
}

# 扁平化数据
flattened_data = flatten_dict(json_data)

# 写入CSV
with open('data.csv', 'w+', encoding='utf-8', newline='') as f:
    writer = csv.writer(f)
    # 先写入表头(所有扁平化后的键)
    writer.writerow(flattened_data.keys())
    # 再写入对应的数据值
    writer.writerow(flattened_data.values())

步骤4:处理多个JSON条目(如果data是数组)

如果你的JSON里data是一个列表(多条数据),调整代码如下,确保所有可能的字段都被作为表头:

# 示例多条目JSON
json_data = {
  "data": [
    {
      "type": "post",
      "id": "123",
      "attributes": {
        "createdAt": "2024-01-01",
        "duration": 120
      }
    },
    {
      "type": "post",
      "id": "124",
      "attributes": {
        "createdAt": "2024-01-02",
        "duration": 180,
        "title": "Extra Field"
      }
    }
  ]
}

# 扁平化每个数据条目
flattened_items = [flatten_dict(item) for item in json_data['data']]

# 收集所有可能的表头(避免遗漏某些条目的额外字段)
headers = set()
for item in flattened_items:
    headers.update(item.keys())
headers = sorted(headers)  # 排序让表头更整齐

# 写入CSV
with open('data.csv', 'w+', encoding='utf-8', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(headers)
    for item in flattened_items:
        # 按表头顺序取对应值,没有的字段填空字符串
        row = [item.get(header, '') for header in headers]
        writer.writerow(row)

关键注意事项

  • 确保writerow()接收的是列表,而不是单个字符串,否则会拆分成字符。
  • 嵌套JSON必须扁平化,否则CSV无法展示深层的字段内容。
  • 用with语句管理文件,比直接open更安全,能自动关闭文件。

内容的提问来源于stack exchange,提问作者Patrik Plecho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:27:26