PathLib рекурсивно удаляет каталог?

Есть ли способ удалить каталог и его содержимое в модуле PathLib? С path.unlink() он удаляет только файл, а path.rmdir() каталог должен быть пустым. Нет ли способа сделать это в одном вызове функции?

Ответ 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()