Есть ли способ удалить каталог и его содержимое в модуле PathLib? С path.unlink() он удаляет только файл, а path.rmdir() каталог должен быть пустым. Нет ли способа сделать это в одном вызове функции?
PathLib рекурсивно удаляет каталог?
Ответ 1
Как вы уже знаете, единственными двумя способами Path для удаления файлов/каталогов являются .unlink() и .rmdir() и оба они не делают то, что вы хотели.
Pathlib - это модуль, который обеспечивает объектно-ориентированные пути в разных ОС, он не должен иметь множество разнообразных методов.
Целью этой библиотеки является предоставление простой иерархии классов для обработки путей файловой системы и общих действий пользователей над ними.
"Необычные" изменения файловой системы, такие как рекурсивное удаление каталога, хранятся в разных модулях. Если вы хотите рекурсивно удалить каталог, вы должны использовать модуль shutil. (Он также работает с экземплярами Path !)
import shutil
import pathlib
import os # for checking results
print(os.listdir())
# ["a_directory", "foo.py", ...]
path = pathlib.Path("a_directory")
shutil.rmtree(path)
print(os.listdir())
# ["foo.py", ...]
Ответ 2
Если вы не возражаете против использования сторонней библиотеки, попробуйте path.py. Его API похож на pathlib.Path, но предоставляет несколько дополнительных методов, включая Path.rmtree() для рекурсивного удаления дерева каталогов.
Ответ 3
В противном случае, вы можете попробовать это, если хотите только pathlib:
from pathlib import Path, os
def rm_tree(pth: Path):
for f in os.listdir(pth):
child = pth / f
if child.is_file():
child.unlink()
else:
rm_tree(child)
pth.rmdir()
rm_tree(your_path)
Ответ 4
Вот чистая реализация pathlib:
from pathlib import Path
def rm_tree(pth):
pth = Path(pth)
for child in pth.glob('*'):
if child.is_file():
child.unlink()
else:
rm_tree(child)
pth.rmdir()