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
相关产品推荐
相关产品推荐

