Есть ли способ удалить каталог и его содержимое в модуле 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()