这是我之前的问题的后续问题:Recursively accessing paths and values of a nested dictionary
考虑这个名为sample_dict
的无意义JSON文件:https://jsoneditoronline.org/?id=da7a486dc2e24bf8b94add9f04c71b4d
鉴于此处的代码:
import json
import csv
json_sample = 'sample_dict.json'
json_file = open(json_sample, 'r')
json_data = json.load(json_file)
csv_file = open('sample_dict.csv', 'w')
items = json_data['sample_dict']
# Thanks @fferri!
def visit_dict(d, path=[]):
for k, v in d.items():
if not isinstance(v, dict):
yield path + [k], v
else:
for visits in visit_dict(v, path + [k]):
yield visits
for key in items:
csv_file.write(','.join('/'.join(k) for k, v in visit_dict(key)))
csv_file.write('\n')
for value in items:
csv_file.write(','.join(str(v) for k, v in visit_dict(value)))
在这里,它打印出列表中的2个字典,包括重复字典。有问题的是:
理想的输出类似于:
dict_id person person/person_id person/name person/age family family/person_id family/members family/members/father family/members/mother family/members/son family/family_id color items_id furniture furniture/type furniture/color furniture/size furniture/purchases
5 None 15 Martin 18 None 20 Jose Maddie Jerry 2 Red None None Chair Brown Large []
10 None 20 Zeeshan 25 None None None None None None None None None Table Blue Blue None []
请原谅错误的格式,但每行中的每个值都应对应于每个列标题。
答案 0 :(得分:0)
我没有使用json或dicts,但我知道dict没有订购。如果你想要一个订单,你必须将键/值对移动到可排序的东西,然后对它们进行排序。
我不太确定你的意思是“重复”
当您使用csv进行打印时,输出将以逗号分隔。如果要在列标题下打印值,则必须获取每个标题和每个值的长度,将单元格长度设置为其中的较大值,并在写入文件之前将填充添加到较短的字符串。
<强>重复强>
好的,我明白了。我没有尝试用列表理解来做这个,但是循环很容易:
key_list = []
for key in items:
for k, v in visit_dict(key):
if k not in key_list: key_list.append(k)
然后,您可以遍历键列表以从项目中的每个键获取值。