使用pathlib递归遍历所有子目录

use*_*212 26 python python-3.x pathlib

如何使用pathlib以递归方式迭代给定目录的所有子目录?

p = Path('docs')
for child in p.iterdir(): child
Run Code Online (Sandbox Code Playgroud)

似乎只是迭代给定目录的直接子节点.

我知道这是可能的os.walk()或glob,但我想使用pathlib因为我喜欢使用路径对象.

pyl*_*ang 29

使用Path.rglob(替代的主导**中Path().glob("**/*")):

path = Path("docs")
for p in path.rglob("*"):
     print(p.name)
Run Code Online (Sandbox Code Playgroud)


Jac*_*din 22

您可以使用对象的glob方法Path:

p = Path('docs')
for i in p.glob('**/*'):
     print(i.name)
Run Code Online (Sandbox Code Playgroud)

  • 还有一个 `rglob` 方法,它在模式之前添加 `**/`,因此您可以执行 `p.rglob('*')` 来代替。 (13认同)
  • 是的,按照下面 @pylang 的回答。我认为更新我的内容是不礼貌的,因为到目前为止他已经取得了很好的成功。 (5认同)
  • 你有正直的性格@JacquesGaudin。干杯。 (3认同)

win*_*and 12

从 Python 3.12 开始使用pathlib.Path.walk()

import pathlib    
path = pathlib.Path(r"E:\folder")
for root, dirs, files in path.walk():
    print("Root: ")
    print(root)
    print("Dirs: ")
    print(dirs)
    print("Files: ")
    print(files)
    print("")
Run Code Online (Sandbox Code Playgroud)


dze*_*lee 10

使用列表理解:

(1) [f.name for f in p.glob("**/*")]  # or
(2) [f.name for f in p.rglob("*")]
Run Code Online (Sandbox Code Playgroud)

如果您只想分别定位文件或目录,则可以将if f.is_file()或添加到 (1) 或 (2)。if f.is_dir()或者"*"用某种模式替换,例如"*.txt"如果您只想定位.txt文件。

请参阅此快速指南。

  • 使用列表理解有什么意义?这如何补充现有的答案? (4认同)
  • 我正在查看打印结果的其他答案,因此我将其作为替代方案提供。但你是对的,原始帖子并没有明确表明它是必要的。 (2认同)

Sij*_*ari 7

pathlib有glob我们可以提供模式作为参数的方法。

例如:Path('abc').glob('**/*.txt')- 它将abc递归查找当前文件夹和所有其他子目录以定位所有txt文件。


小智 5

要仅查找文件夹,正确的 glob 字符串是:

'**/'
Run Code Online (Sandbox Code Playgroud)

因此,要查找路径中所有文件夹的所有路径,请执行以下操作:

p = Path('docs')
for child in p.glob('**/'):
    print(child)
Run Code Online (Sandbox Code Playgroud)

如果您只想要没有路径的文件夹名称,则像这样打印文件夹的名称:

p = Path('docs')
for child in p.glob('**/'):
    print(child.name)
Run Code Online (Sandbox Code Playgroud)