在python中递归地打印嵌套.json数据中的特定键和值



所以当我试图从一个复杂的嵌套。json文件中获得特定的值和键时,我一直在来回。

我发现一个好的方法是使用递归函数。

我对它有基本的了解。但是我不能为我的原始文件创建一个。

import json
#open json file in folder
with open('demk-bkp-001.json') as file:
data = json.load(file)

这里是完整的。json数据供参考:https://pastebin.com/hmjv81nS

我的目标是获取"name", "size"one_answers"mountpoint".

提示和示例似乎不能帮助我在多个平台上,因此我找不到一个类似的嵌套json文件。请帮忙:)

迭代方法:在数据结构

中存储待处理的项递归函数是一种可能性;另一种可能性是保留一个数据结构,保存到目前为止遇到但尚未处理的所有字典;然后,只要您至少还有一个未处理的字典,就处理它;如果它有子节点,将它们添加到结构中。这里我使用一个简单的python列表:

names, sizes, mountpoints = [],[],[]
to_be_processed = data['blockdevices']
while to_be_processed:
d = to_be_processed.pop()
names.append(d['name'])
sizes.append(d['size'])
mountpoints.append(d['mountpoint'])
if 'children' in d:
to_be_processed.extend(d['children'])

保持顺序:使用FIFO而不是LIFO数据结构

注意,上面提供的迭代代码使用了一个python列表及其方法.extend().pop()。实际上,这将python列表用作后进先出(LIFO)数据结构。如果你想保持你的数据的顺序,你想使用先进先出的数据结构,而不是FIFO。你可以用.pop(0)替换.pop()来删除第一个元素而不是最后一个元素,但请注意,list.pop(0)在python中不是一个有效的操作;它需要复制列表中的所有元素。相反,我们可以使用collections.deque对象及其.extend().popleft()方法:

  • collections.deque
  • 文档
import collections
names, sizes, mountpoints = [],[],[]
to_be_processed = collections.deque(data['blockdevices'])
while to_be_processed:
d = to_be_processed.popleft()
names.append(d['name'])
sizes.append(d['size'])
mountpoints.append(d['mountpoint'])
if 'children' in d:
to_be_processed.extend(d['children'])
<标题>

递归方法递归方法也是可能的。在data['blockdevices']上调用它,如果有子节点,则让它对子节点进行递归调用。

def process_data(d_list, names, sizes, mountpoints):
for d in d_list:
names.append(d['name'])
sizes.append(d['size'])
mountpoints.append(d['mountpoint'])
if 'children' in d:
process_data(d['children'], names, sizes, mountpoints)
return names, sizes, mountpoints
process_data(data['blockdevices'], [], [], [])

您可以使用递归生成器执行以下操作:

keys = ("name", "size", "mountpoint")
def traverse(objs):
for obj in objs:
yield {k: obj[k] for k in keys}
yield from traverse(obj.get("children", []))
list(traverse(data["blockdevices"]))
[{'mountpoint': None, 'name': 'sda', 'size': '931,5G'},
{'mountpoint': None, 'name': 'sda1', 'size': '18,6G'},
{'mountpoint': '/', 'name': 'md0', 'size': '18,6G'},
{'mountpoint': None, 'name': 'sda2', 'size': '1K'},
{'mountpoint': None, 'name': 'sda5', 'size': '9,3G'},
{'mountpoint': '[SWAP]', 'name': 'md1', 'size': '9,3G'},
{'mountpoint': None, 'name': 'sda6', 'size': '18,6G'},
{'mountpoint': '/home', 'name': 'md2', 'size': '18,6G'},
{'mountpoint': None, 'name': 'sda7', 'size': '885G'},
{'mountpoint': '/var', 'name': 'md3', 'size': '884,8G'},
{'mountpoint': None, 'name': 'sdb', 'size': '931,5G'},
{'mountpoint': None, 'name': 'sdb1', 'size': '18,6G'},
{'mountpoint': '/', 'name': 'md0', 'size': '18,6G'},
{'mountpoint': None, 'name': 'sdb2', 'size': '1K'},
{'mountpoint': None, 'name': 'sdb5', 'size': '9,3G'},
{'mountpoint': '[SWAP]', 'name': 'md1', 'size': '9,3G'},
{'mountpoint': None, 'name': 'sdb6', 'size': '18,6G'},
{'mountpoint': '/home', 'name': 'md2', 'size': '18,6G'},
{'mountpoint': None, 'name': 'sdb7', 'size': '885G'},
{'mountpoint': '/var', 'name': 'md3', 'size': '884,8G'},
{'mountpoint': None, 'name': 'sdc', 'size': '5,5T'},
{'mountpoint': None, 'name': 'sdc1', 'size': '5,5T'},
{'mountpoint': '/mnt/data', 'name': 'DATA', 'size': '5,5T'},
{'mountpoint': None, 'name': 'sdd', 'size': '3,7T'},
{'mountpoint': None, 'name': 'sdd1', 'size': '3,7T'},
{'mountpoint': '/mnt/data2', 'name': 'DATA2', 'size': '3,7T'},
{'mountpoint': None, 'name': 'sde', 'size': '9,1T'},
{'mountpoint': None, 'name': 'sde1', 'size': '9,1T'}]

相关内容

  • 没有找到相关文章

最新更新