遍历目录,并返回嵌套列表以及Python中的子目录和文件

问题描述 投票:0回答:1

我想递归遍历Python中的目录,并获得所有子目录和文件的嵌套列表。我找到了许多解决方案来解决第一部分(递归遍历目录),但是没有一个允许我以所需的格式获得输出。

对于要使用的库没有任何限制/偏好。我尝试使用pathlib,但是os.walk()也很好。另外,它不是have的递归函数。循环很好。

我具有以下结构:

root
├── file1.txt
├── file2.txt
├── sub1
│   ├── subfile1.txt
│   └── subsub
│       └── subsubfile1.txt
└── sub2

而且我需要将结果作为这样的嵌套列表:

[
  {
    'name': 'file1.txt'
  },
  {
    'name': 'file2.txt'
  },
  {
    'name': 'sub1',
    'children': [
      {
        'name': 'subfile1.txt'
      },
      {
        'name': 'subsub',
        'children': [
          {
            'name': 'subsubfile1.txt'
          }
        ]
      }
    ]
  },
  {
    'name': 'sub2'.
    'children': []
  }
]

这是我所走的路,但未给出正确的结果:

from pathlib import Path
def walk(path: Path, result: list) -> list:
    for p in path.iterdir():
        if p.is_file():
            result.append({
                'name': p.name
            })
            yield result
        else:
            result.append({
                'name': p.name,
                'children': list(walk(p, result))
            })
walk(Path('root'), [])  # initial call

除了该代码不起作用的事实之外,我还遇到了递归集合的问题。当我尝试漂亮打印时,它显示:

'children': [ <Recursion on list with id=4598812496>,
                    <Recursion on list with id=4598812496>],
      'name': 'sub1'},

是否可以将该递归对象作为列表获取?

[如果有人想知道为什么我需要这种结构,而不是像pathlib.glob()返回的平面列表那样的平面列表,那是因为此列表将被我的API另一端的代码占用:https://vuetifyjs.com/en/components/treeview/#slots

python recursion treeview pathlib
1个回答
0
投票

您可以在递归中使用os.listdir

import os
def to_tree(s=os.getcwd()):
  return [{'name':i} if os.path.isfile(f'{s}/{i}') else 
              {'name':i, 'children':to_tree(f'{s}/{i}')} for i in os.listdir(s)]
© www.soinside.com 2019 - 2024. All rights reserved.