python - 基于 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())
解决方案
您可以使用标准库中的集合和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)
推荐阅读
- sql - 错误 42803。列 XXXX 必须显示子句 GROUP BY 或在聚合函数中使用
- node.js - 节点 cron 作业仅在 GCP App Engine 上第一次执行
- angular - 导入 Angular 子项目时出错
- javascript - 单击按钮后为所有连接的用户重新加载页面
- html - 我们可以用angular中的自定义css覆盖选择器的默认样式吗
- python - 从 Python 中的多个列中删除相同的元素
- python - 如何使用 selenium 读取 python 中的隐藏文本?
- c# - 如何在 Visual Studio 中解决“CA0001:运行代码分析时出现未知错误”
- asp.net-core - HttpContext.User 在 Asp.net 核心 MVC 3.1 中的控制器内为空
- string - 如何在 PowerShell 中使用 select-string 查找字符串不匹配的文件?