python - 将 JSON 数据写入 CSV
问题描述
我有一个动态 json,其中键(属性)会根据记录而有所不同。
我想将下面的 json 数据写入 csv 文件:
[{"Id": "12345",
"attributes": {"Address": [{"label": "United Kingdom",
"value": {"AddressLine": [{"value": "Baker "
"Street"}]}},
{"label": "United States",
"value": {"AddressLine": [{"value": "Florida"}]}}],
"CountryCode": [{"value": "Australia"}],
"Identifiers": [{"value": {"Type": [{"value": "Licence Id"}]}},
{"value": {"Type": [{"value": "NPI"}]}}],
"StatusReasonCode": [{"value": "XXX"}],
"UniqueId": [{"value": "71581742"}]},
"createdBy": "Rahul"}]
数据应采用以下 csv 格式:
ID, createdBy, CountryCode, StatusReasonCode, Identifiers, UniqueId, AddressLine
12345,Rahul,Australia,XXX,Licence Id,71581742,Baker Street
12345,Rahul,Australia,XXX,NPI,71581742,Florida
这是我从json中提取数据的代码:
import json
with open('data.json') as f:
data = json.load(f)
for key,value in data.items():
if(type(value))==str:
print(key + ',' + value)
# global res
res =[]
if(type(value))==list:
for fg in value:
crosswalk_final=fg['value']
if (type(value))== dict:
for key1,val in value.items():
for k in val:
if type(k['value']) == dict:
for sub_key,sub_value in k.items():
if(type(sub_value)) == dict:
for child_key,child_value in sub_value.items():
if(type(child_value)) == list:
for m in child_value:
if type(m['value']) == dict:
for qaq,waq in m.items():
if (isinstance(waq, dict)):
for our,pur in waq.items():
for qq in pur:
print(our+','+qq['value'])
else:
pass
print(key1+'_'+sub_key+'_'+child_key+','+m['value'])
else:
attr1=(key+'_'+key1+','+k['value'])
print((attr1))
上面的代码给了我以下格式的结果:
Id,12345
createdBy,Rahul
attributes_UniqueId,71581742
attributes_CountryCode,Australia
attributes_StatusReasonCode,XXX
Address_value_AddressLine,Baker Street
Address_value_AddressLine,Florida
Identifiers_value_Type,Licence Id
Identifiers_value_Type,NPI
但是我不确定如何在我的 csv 中编写它(以上面显示的相同格式)。
解决方案
编写一个函数,将字典展平成一个恒定长度的列表。如果缺少键,请将值设置为无。例子:
data_dict = {"a": 1, "c": 12, "b": 0}
data_list = [data_dict.get("a"), data_dict.get("b"), data_dict.get("c")]
然后插入csv。
推荐阅读
- spring-boot - 未使用 Spring Boot 变量
- apache-spark - 需要使用迭代多个列的过滤器值过滤 Spark 数据帧
- knockout.js - Knockoutjs:使用自定义谓词通知扩展程序
- c# - 如何只为括号中的文本着色
- windows - 当我不希望批处理文件打印“=”时出现问题
- flutter - 更新继承小部件的变量值
- java - Jython - 将带有 Java 字符串的 Java 数组转换为带有 Python 字符串的 Python 列表
- list - 折叠包含未定义的列表时,为什么 foldr 不返回未定义?
- javascript - 当我将组件实例创建到数组中时,vue Store 不会加载/无法读取未定义的属性“状态”
- django - Django:对象没有属性“更新”