J'obtiens une erreur «accès refusé» lorsque j'essaie de supprimer un dossier qui n'est pas vide. J'ai utilisé la commande suivante dans ma tentative: os.remove("/folder_name")
.
Quelle est la manière la plus efficace de supprimer / supprimer un dossier / répertoire qui n'est pas vide?
rm -rf
comportement spécifique , voir: stackoverflow.com/questions/814167/…Réponses:
Référence de bibliothèque standard: shutil.rmtree .
De par sa conception,
rmtree
échoue sur les arborescences de dossiers contenant des fichiers en lecture seule. Si vous souhaitez que le dossier soit supprimé, qu'il contienne ou non des fichiers en lecture seule, utilisezla source
rmtree
cela échouera s'il y a des fichiers en lecture seule: stackoverflow.com/questions/2656322/…De la documentation python sur
os.walk()
:la source
la source
ignore_errors=True
résout le problème.onerror
paramètre est utilisé à la place deignore_errors
. De cette façon, les fichiers en lecture seule sont supprimés plutôt qu'ignorés.rmtree()
méthode entière est ignorée.à partir de python 3.4, vous pouvez utiliser:
où
pth
est unepathlib.Path
instance. Bien, mais peut-être pas le plus rapide.la source
De docs.python.org :
la source
Si ignore_errors est défini, les erreurs sont ignorées; sinon, si onerror est défini, il est appelé pour gérer l'erreur avec des arguments (func, path, exc_info) où func est os.listdir, os.remove ou os.rmdir; chemin est l'argument de cette fonction qui a provoqué son échec; et exc_info est un tuple renvoyé par sys.exc_info (). Si ignore_errors est false et onerror est None, une exception est déclenchée. Entrez le code ici
la source
Basé sur la réponse de kkubasik, vérifiez si le dossier existe avant de le supprimer, plus robuste
la source
try
supprimer et de gérerexcept
que d'appeler enexists()
premiersi vous êtes sûr que vous voulez supprimer tout l'arborescence de dir et que vous n'êtes plus intéressé par le contenu de dir, alors l'exploration de l'arborescence de dir entière est stupide ... il suffit d'appeler la commande native OS de python pour le faire. Il sera plus rapide, efficace et consommera moins de mémoire.
ou * nix
En python, le code ressemblera à ..
la source
shutil.rmdir
est de vous isoler du type de système d'exploitation.Juste quelques options de python 3.5 pour compléter les réponses ci-dessus. (J'aurais adoré les trouver ici).
Supprimer le dossier s'il est vide
Supprimer également le dossier s'il contient ce fichier
supprimer le dossier s'il ne contient que des fichiers .srt ou .txt
Supprimer le dossier si sa taille est inférieure à 400 Ko:
la source
if files[0]== "desktop.ini" or:
Je voudrais ajouter une approche "pure pathlib":
Cela repose sur le fait qu'il
Path
est ordonnable, et les chemins plus longs seront toujours triés après les chemins plus courts, tout commestr
. Par conséquent, les répertoires viendront avant les fichiers. Si nous inversons le tri, les fichiers arriveront avant leurs conteneurs respectifs, nous pouvons donc simplement les dissocier / rmdir un par un en un seul passage.Avantages:
pathlib
promet dans Python 3.6; aucune opération ci-dessus n'a déclaré ne pas fonctionner sur Windows)la source
la source
Si vous ne souhaitez pas utiliser le
shutil
module, vous pouvez simplement utiliser leos
module.la source
os.remove
ne peut pas supprimer les répertoires, ce qui augmenteraOsError
sidirectoryToRemove
contient des sous-répertoires.Dix ans plus tard et en utilisant Python 3.7 et Linux, il existe encore différentes façons de procéder:
Il s'agit essentiellement d'utiliser le module de sous-processus de Python pour exécuter le script bash
$ rm -rf '/path/to/your/dir
comme si vous utilisiez le terminal pour accomplir la même tâche. Ce n'est pas entièrement en Python, mais cela se fait.La raison pour laquelle j'ai inclus l'
pathlib.Path
exemple est que, selon mon expérience, il est très utile lorsqu'il s'agit de nombreux chemins qui changent. Les étapes supplémentaires d'importation dupathlib.Path
module et de conversion des résultats finaux en chaînes sont souvent moins coûteuses pour moi en termes de temps de développement. Il serait pratique de disposerPath.rmdir()
d'une option arg pour gérer explicitement les répertoires non vides.la source
rmtree
des dossiers cachés comme.vscode
. Ce dossier a été détecté en tant que fichier texte et l'erreur m'a dit que ce fichier étaitbusy
et ne pouvait pas être supprimé.Pour supprimer un dossier même s'il n'existe peut-être pas (en évitant la condition de concurrence critique dans la réponse de Charles Chow ) mais qu'il y a toujours des erreurs lorsque d'autres choses vont mal (par exemple, des problèmes d'autorisation, une erreur de lecture sur le disque, le fichier n'est pas un répertoire)
Pour Python 3.x:
Le code Python 2.7 est presque le même:
la source
Avec os.walk, je proposerais la solution qui consiste en 3 appels Python à une ligne:
Tous les sous-répertoires du premier script chmod, tous les fichiers du second script chmod. Ensuite, le troisième script supprime tout sans aucun obstacle.
J'ai testé cela à partir du "Shell Script" dans un travail Jenkins (je ne voulais pas stocker un nouveau script Python dans SCM, c'est pourquoi j'ai cherché une solution sur une ligne) et cela a fonctionné pour Linux et Windows.
la source
pathlib
, vous pouvez combiner les deux premières étapes en une seule:[p.chmod(0o666) for p in pathlib.Path(_path_).glob("**/*")]
Vous pouvez utiliser la commande os.system pour plus de simplicité:
Comme il est évident, il appelle en fait le terminal système pour accomplir cette tâche.
la source
J'ai trouvé un moyen très simple de supprimer n'importe quel dossier (même NON vide) ou fichier sur WINDOWS OS .
la source
Pour Windows, si le répertoire n'est pas vide et que vous avez des fichiers en lecture seule ou des erreurs comme
Access is denied
The process cannot access the file because it is being used by another process
Essaye ça,
os.system('rmdir /S /Q "{}"'.format(directory))
C'est équivalent
rm -rf
sous Linux / Mac.la source