首页 > 解决方案 > 基于 JSON 字典键的 CSV 标头

问题描述

例如,我有一个这样的 JSON:

[
    {
        'name':'test1',
        'random1':'random_1_value'
    },
    {
        'name':'test2',
        'random2':'random_2_value'
        'random4':'random_4_value'
    },
    {
        'name':'test3',
        'random3':'random_3_value'
    },
]

我想转换这个 JSON 并根据字典键构造 CSV 标头。然后分别填充每一行。预期输出:

name, random1, random2, random4, random3
test1, random_1_value
test2, ,random_2_value, random_4_value, ,
test3, , , , random_3_value

到目前为止,这是我的代码:

data = json.loads(open('output_data.json').read())
csvwriter = csv.writer(open("output.csv", "w"))
count = 0
for emp in data:
    if count == 0:
        header = emp.keys()
        csvwriter.writerow(header)
        count += 1
    csvwriter.writerow(emp.values())

标签: pythonjsoncsv

解决方案


您可以使用标准库中的集合csv模块的组合来执行此操作。

我们可以使用collections.OrderedDict来按照它们出现的顺序获取列名。

我们使用 anOrderedDict以便代码可以与 3.7 之前的 Python 版本一起使用。从 Python 3.7 开始,该语言保证普通字典记住插入键的顺序。如果您的代码只能由 Python 3.7+ 运行,您可以使用内置的dict而不是OrderedDict.

headers = collections.OrderedDict((key, None) for dict_ in data for key in dict_) 

现在已经生成了列名,使用csv.DictWriter将数据中的每个字典写入输出文件。 DictWriter自动处理丢失的键,确保每个数据项都写入正确的列。

with open('output.csv', 'w', newlines='') as f:
    writer = csv.DictWriter(f, fieldnames=headers)
    # Write the column names to file.
    writer.writeheader()
    # Write the data to file.
    writer.writerows(data)

推荐阅读