web-dev-qa-db-fra.com

PathLib supprimer récursivement le répertoire?

Existe-t-il un moyen de supprimer un répertoire et son contenu dans le module PathLib? Avec path.unlink() il ne supprime qu'un fichier, avec path.rmdir() le répertoire doit être vide. N'y a-t-il aucun moyen de le faire en un seul appel de fonction?

15
Jasonca1

Comme vous le savez déjà, les deux seules méthodes Path pour supprimer des fichiers/répertoires sont .unlink() et .rmdir() et les deux ne font pas ce que vous vouliez.

Pathlib est un module qui fournit des chemins orientés objet à travers différents OS, il n'est pas censé avoir beaucoup de méthodes diverses.

Le but de cette bibliothèque est de fournir une hiérarchie simple de classes pour gérer les chemins du système de fichiers et les opérations courantes que les utilisateurs effectuent sur eux.

Les modifications "peu communes" du système de fichiers, telles que la suppression récursive d'un répertoire, sont stockées dans différents modules. Si vous souhaitez supprimer récursivement un répertoire, vous devez utiliser le module shutil. (Cela fonctionne aussi avec les instances 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", ...]
29
abccd

Si cela ne vous dérange pas d'utiliser une bibliothèque tierce, essayez path.py . Son API est similaire à pathlib.Path , mais fournit quelques méthodes supplémentaires, notamment Path.rmtree() pour supprimer récursivement une arborescence de répertoires.

4
AXO

Sinon, vous pouvez essayer celui-ci si vous ne voulez que 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)
0
Rami