Python >> Tutoriel Python >  >> Python

Comment supprimer un dossier non vide en Python ?

Formulation du problème :

  • Étant donné un path dans un dossier sous forme de chaîne Python. Le dossier n'est pas vide.
  • Comment supprimer tout le dossier dans votre script Python ?

Exemple :Dites, vous avez le path='path/to/folder' dans votre script Python et il contient des fichiers et des sous-dossiers :

path
--to
----folder
------file1.dat
------file2.dat
------subfolder1
--------file3.dat
------subfolder2
--------file4.dat

Vous souhaitez supprimer tout le contenu en gras dans l'exemple de structure de dossiers précédent.

Méthode 1 :Supprimer des fichiers immédiatement avec shutdown.rmtree()

Le module shutil fournit une fonction rmtree() qui supprime tous les dossiers et fichiers de manière récursive d'un chemin donné.

import shutil

# String path of folder to be removed:
path = 'path/to/folder'

# Remove the folder recursively:
shutil.rmtree(path)

Le shutil.rmtree() La fonction supprime toute l'arborescence des répertoires au niveau du chemin fourni pointant vers un répertoire (pas un fichier ou un lien symbolique d'un répertoire).

Notez que les fichiers en lecture seule ne peuvent pas être supprimés d'un dossier à l'aide de cet utilitaire car ils sont, eh bien, en lecture seule . C'est pourquoi il génère une erreur lorsque vous essayez de supprimer des fichiers en lecture seule. Si vous souhaitez supprimer le contenu restant du dossier malgré tout, vous devez définir l'argument facultatif ignore_errors .

shutil.rmtree(path, ignore_errors=True)

Cependant, les fichiers en lecture seule ne seront en aucun cas supprimés !

Méthode 2 :supprimer des fichiers individuellement avec os.walk()

Une approche plus fine est fournie par le os.walk() fonction :

import os

# String path of folder to be removed:
path = 'path/to/folder'

# Remove the folder by walking through the files (from the bottom up):
for root, dirs, files in os.walk(path, topdown=False):
    for name in files:
        os.remove(os.path.join(root, name))
    for name in dirs:
        os.rmdir(os.path.join(root, name))

ATTENTION :Avant d'utiliser ce code, assurez-vous qu'il est adapté à votre problème spécifique car il peut potentiellement supprimer tous les fichiers de votre système d'exploitation si vous spécifiez votre chemin de niveau supérieur comme '/' ou tout autre chemin racine dans votre système d'exploitation spécifique.

  • Le os.walk(path, topdown=False) La méthode fournit un itérateur sur tous les fichiers au path donné . Le topdown=False garantit que vous vous déplacez de bas en haut, c'est-à-dire que vous supprimez d'abord tout le contenu d'un dossier avant de supprimer le dossier lui-même.
  • Le os.remove(os.path.join(root, name)) la méthode supprime le fichier à l'emplacement root + namename est le suffixe du fichier (par exemple, 'file.dat' ) et root est le chemin d'accès à ce fichier (par exemple, '/path/to/file/' ).
  • Le os.rmdir(os.path.join(root, name)) la méthode supprime le dossier à l'emplacement root + namename est le suffixe du dossier (par exemple, 'file.dat' ) et root est le chemin d'accès à ce fichier (par exemple, '/path/to/file/' ).

Méthode 3 :Parcourir les fichiers et les dossiers à l'aide de pathlib

import pathlib


# String path of folder to be removed:
path = 'path/to/folder'

# Remove the folder
del_folder(path):
    for sub in path.iterdir():
        if sub.is_dir():
            # Delete folder if it is a folder
            del_folder(sub)
        else :
            # Delete file if it is a file:
            sub.unlink()
    
    # This removes the top-level folder:
    path.rmdir()

del_folder(pathlib.Path(path))

Ressources :

  • https://stackoverflow.com/questions/303200/how-do-i-remove-delete-a-folder-that-is-not-empty
  • https://stackoverflow.com/questions/1557351/python-delete-non-empty-dir