Рекурсивно перебирать все подкаталоги, используя pathlib
Как я могу использовать pathlib для рекурсивной итерации по всем подкаталогам данного каталога?
p = Path('docs')
for child in p.iterdir(): child
только кажется, что перебирает непосредственных потомков данного каталога.
Я знаю, что это возможно с os.walk()
или же glob
, но я хочу использовать pathlib, потому что мне нравится работать с объектами пути.
6 ответов
Вы можете использовать glob
метод Path
объект:
p = Path('docs')
for i in p.glob('**/*'):
print(i.name)
В качестве альтернативы используйте Path.rglob
(заменяет ведущий **
):
p = Path("docs")
for p in p.rglob("*"):
print(p.name)
Чтобы найти только папки, правая строка глобуса:
'**/'
Итак, чтобы найти все пути для всех папок на вашем пути, сделайте следующее:
p = Path('docs')
for child in p.glob('**/'):
print(child)
Если вам просто нужны имена папок без путей, распечатайте имя папки следующим образом:
p = Path('docs')
for child in p.glob('**/'):
print(child.name)
В Python 3.12 (не выпущенном на момент написания этой статьи) вы сможете использоватьpathlib.Path.walk()
Используйте понимание списка:
(1) [f.name for f in p.glob("**/*")] # or
(2) [f.name for f in p.rglob("*")]
Можете добавить if f.is_file()
или if f.is_dir()
на (1) или (2), если вы хотите настроить таргетинг только на файлы или только каталоги соответственно. Или заменить"*"
с каким-то узором вроде "*.txt"
если вы хотите нацелиться .txt
только файлы.
См. Это краткое руководство.
pathlib
имеет glob
метод, в котором мы можем предоставить шаблон в качестве аргумента.
Например: Path('abc').glob('**/*.txt')
- будет искать текущую папку abc
и все другие подкаталоги рекурсивно, чтобы найти все txt
файлы.