Comment supprimer un fichier ou un dossier en Python?
Comment supprimer un fichier ou un dossier en Python?
Réponses:
os.remove()
supprime un fichier.
os.rmdir()
supprime un répertoire vide.
shutil.rmtree()
supprime un répertoire et tout son contenu.
Path
les objets du pathlib
module Python 3.4+ exposent également ces méthodes d'instance:
pathlib.Path.unlink()
supprime un fichier ou un lien symbolique.
pathlib.Path.rmdir()
supprime un répertoire vide.
os.remove()
lève une exception, il peut donc être nécessaire de vérifier d' os.path.isfile()
abord, ou d'envelopper un try
.
os.remove()
si un fichier n'existe pas est FileNotFoundError
.
os.remove()
plusieurs arguments pour supprimer plusieurs fichiers, ou appelez-vous chaque fois pour chaque fichier?
import os
os.remove("/tmp/<file_name>.txt")
Ou
import os
os.unlink("/tmp/<file_name>.txt")
Ou
Bibliothèque pathlib pour Python version> 3.5
file_to_rem = pathlib.Path("/tmp/<file_name>.txt")
file_to_rem.unlink()
Dissocier la méthode utilisée pour supprimer le fichier ou le lien symbolik.
Si missing_ok est faux (par défaut), FileNotFoundError est levée si le chemin n'existe pas.
Si missing_ok est vrai, les exceptions FileNotFoundError seront ignorées (même comportement que la commande POSIX rm -f).
Modifié dans la version 3.8: Le paramètre missing_ok a été ajouté.
os.path.isfile("/path/to/file")
exception handling.
EXEMPLE pouros.path.isfile
#!/usr/bin/python
import os
myfile="/tmp/foo.txt"
## If file exists, delete it ##
if os.path.isfile(myfile):
os.remove(myfile)
else: ## Show an error ##
print("Error: %s file not found" % myfile)
#!/usr/bin/python
import os
## Get input ##
myfile= raw_input("Enter file name to delete: ")
## Try to delete the file ##
try:
os.remove(myfile)
except OSError as e: ## if failed, report it back to the user ##
print ("Error: %s - %s." % (e.filename, e.strerror))
Entrez le nom du fichier à supprimer: demo.txt Erreur: demo.txt - Aucun fichier ou répertoire de ce type. Entrez le nom du fichier à supprimer: rrr.txt Erreur: rrr.txt - Opération non autorisée. Entrez le nom du fichier à supprimer: foo.txt
shutil.rmtree()
Exemple pour shutil.rmtree()
#!/usr/bin/python
import os
import sys
import shutil
# Get directory name
mydir= raw_input("Enter directory name: ")
## Try to remove tree; if failed show an error using try...except on screen
try:
shutil.rmtree(mydir)
except OSError as e:
print ("Error: %s - %s." % (e.filename, e.strerror))
Voici une fonction robuste qui utilise à la fois os.remove
et shutil.rmtree
:
def remove(path):
""" param <path> could either be relative or absolute. """
if os.path.isfile(path) or os.path.islink(path):
os.remove(path) # remove the file
elif os.path.isdir(path):
shutil.rmtree(path) # remove dir and all contains
else:
raise ValueError("file {} is not a file or dir.".format(path))
remove(path);
appel ISO C.
os.path.islink(file_path):
un bug, devrait êtreos.path.islink(path):
Vous pouvez utiliser le haut- pathlib
module (nécessite Python 3.4+, mais il y a des rétroportages pour les versions plus anciennes sur PyPI: pathlib
, pathlib2
).
Pour supprimer un fichier, il existe la unlink
méthode:
import pathlib
path = pathlib.Path(name_of_file)
path.unlink()
Ou la rmdir
méthode pour supprimer un dossier vide :
import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
pathlib
qui puisse gérer la suppression de répertoires non vides. Cependant, vous pouvez utiliser shutil.rmtree
. Il a été mentionné dans plusieurs autres réponses, donc je ne l'ai pas inclus.
Comment supprimer un fichier ou un dossier en Python?
Pour Python 3, pour supprimer le fichier et le répertoire individuellement, utilisez respectivement les méthodes unlink
et object:rmdir
Path
from pathlib import Path
dir_path = Path.home() / 'directory'
file_path = dir_path / 'file'
file_path.unlink() # remove file
dir_path.rmdir() # remove directory
Notez que vous pouvez également utiliser des chemins relatifs avec des Path
objets et vous pouvez vérifier votre répertoire de travail actuel avec Path.cwd
.
Pour supprimer des fichiers et répertoires individuels dans Python 2, consultez la section ainsi étiquetée ci-dessous.
Pour supprimer un répertoire contenant du contenu, utilisez shutil.rmtree
et notez qu'il est disponible en Python 2 et 3:
from shutil import rmtree
rmtree(dir_path)
Nouveau dans Python 3.4 est l' Path
objet.
Utilisons-en un pour créer un répertoire et un fichier pour en démontrer l'utilisation. Notez que nous utilisons le /
pour joindre les parties du chemin, cela contourne les problèmes entre les systèmes d'exploitation et les problèmes liés à l'utilisation de barres obliques inverses sous Windows (où vous devez soit doubler vos barres obliques inversées, \\
soit utiliser des chaînes brutes, comme r"foo\bar"
):
from pathlib import Path
# .home() is new in 3.5, otherwise use os.path.expanduser('~')
directory_path = Path.home() / 'directory'
directory_path.mkdir()
file_path = directory_path / 'file'
file_path.touch()
et maintenant:
>>> file_path.is_file()
True
Supprimons-les maintenant. D'abord le fichier:
>>> file_path.unlink() # remove file
>>> file_path.is_file()
False
>>> file_path.exists()
False
Nous pouvons utiliser le globbing pour supprimer plusieurs fichiers - créons d'abord quelques fichiers pour cela:
>>> (directory_path / 'foo.my').touch()
>>> (directory_path / 'bar.my').touch()
Ensuite, parcourez simplement le motif glob:
>>> for each_file_path in directory_path.glob('*.my'):
... print(f'removing {each_file_path}')
... each_file_path.unlink()
...
removing ~/directory/foo.my
removing ~/directory/bar.my
Maintenant, démontrant la suppression du répertoire:
>>> directory_path.rmdir() # remove directory
>>> directory_path.is_dir()
False
>>> directory_path.exists()
False
Et si nous voulons supprimer un répertoire et tout ce qu'il contient? Pour ce cas d'utilisation, utilisezshutil.rmtree
Recréons notre répertoire et notre fichier:
file_path.parent.mkdir()
file_path.touch()
et notez que cela rmdir
échoue à moins qu'il ne soit vide, c'est pourquoi rmtree est si pratique:
>>> directory_path.rmdir()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "~/anaconda3/lib/python3.6/pathlib.py", line 1270, in rmdir
self._accessor.rmdir(self)
File "~/anaconda3/lib/python3.6/pathlib.py", line 387, in wrapped
return strfunc(str(pathobj), *args)
OSError: [Errno 39] Directory not empty: '/home/username/directory'
Maintenant, importez rmtree et passez le répertoire à la fonction:
from shutil import rmtree
rmtree(directory_path) # remove everything
et nous pouvons voir que le tout a été supprimé:
>>> directory_path.exists()
False
Si vous êtes sur Python 2, il y a un backport du module pathlib appelé pathlib2 , qui peut être installé avec pip:
$ pip install pathlib2
Et puis vous pouvez alias la bibliothèque pour pathlib
import pathlib2 as pathlib
Ou importez simplement directement l' Path
objet (comme illustré ici):
from pathlib2 import Path
Si c'est trop, vous pouvez supprimer des fichiers avec os.remove
ouos.unlink
from os import unlink, remove
from os.path import join, expanduser
remove(join(expanduser('~'), 'directory/file'))
ou
unlink(join(expanduser('~'), 'directory/file'))
et vous pouvez supprimer des répertoires avec os.rmdir
:
from os import rmdir
rmdir(join(expanduser('~'), 'directory'))
Notez qu'il existe également un os.removedirs
- il supprime uniquement les répertoires vides de manière récursive, mais il peut convenir à votre cas d'utilisation.
rmtree(directory_path)
fonctionne en python 3.6.6 mais pas en python 3.5.2 - vous en avez besoin rmtree(str(directory_path)))
.
import os
folder = '/Path/to/yourDir/'
fileList = os.listdir(folder)
for f in fileList:
filePath = folder + '/'+f
if os.path.isfile(filePath):
os.remove(filePath)
elif os.path.isdir(filePath):
newFileList = os.listdir(filePath)
for f1 in newFileList:
insideFilePath = filePath + '/' + f1
if os.path.isfile(insideFilePath):
os.remove(insideFilePath)
shutil.rmtree est la fonction asynchrone, donc si vous voulez vérifier quand elle est terminée, vous pouvez utiliser while ... loop
import os
import shutil
shutil.rmtree(path)
while os.path.exists(path):
pass
print('done')
shutil.rmtree
n'est pas censé être asynchrone. Cependant, il peut sembler être sur Windows avec des analyseurs de virus interférant.
os.unlink(path, *, dir_fd=None)
ou
os.remove(path, *, dir_fd=None)
Les deux fonctions sont sémantiquement identiques. Cette fonction supprime (supprime) le chemin du fichier. Si le chemin n'est pas un fichier et qu'il s'agit d'un répertoire, une exception est déclenchée.
shutil.rmtree(path, ignore_errors=False, onerror=None)
ou
os.rmdir(path, *, dir_fd=None)
Afin de supprimer des arborescences de répertoires entières, shutil.rmtree()
peut être utilisé. os.rmdir
ne fonctionne que lorsque le répertoire est vide et existe.
os.removedirs(name)
Il supprime chaque répertoire parent vide avec self jusqu'à ce que le parent ait du contenu
ex. os.removedirs ('abc / xyz / pqr') supprimera les répertoires par ordre 'abc / xyz / pqr', 'abc / xyz' et 'abc' s'ils sont vides.
Pour plus d' informations check doc officiel: os.unlink
, os.remove
, os.rmdir
, shutil.rmtree
,os.removedirs
Pour supprimer tous les fichiers du dossier
import os
import glob
files = glob.glob(os.path.join('path/to/folder/*'))
files = glob.glob(os.path.join('path/to/folder/*.csv')) // It will give all csv files in folder
for file in files:
os.remove(file)
Pour supprimer tous les dossiers d'un répertoire
from shutil import rmtree
import os
// os.path.join() # current working directory.
for dirct in os.listdir(os.path.join('path/to/folder')):
rmtree(os.path.join('path/to/folder',dirct))
Pour éviter le problème TOCTOU mis en évidence par le commentaire d'Éric Araujo , vous pouvez intercepter une exception pour appeler la bonne méthode:
def remove_file_or_dir(path: str) -> None:
""" Remove a file or directory """
try:
shutil.rmtree(path)
except NotADirectoryError:
os.remove(path)
Depuis shutil.rmtree()
ne supprimera que les répertoires et / os.remove()
ou os.unlink()
supprimera uniquement les fichiers.
shutil.rmtree()
supprime non seulement le répertoire mais aussi son contenu.
Je recommande d'utiliser subprocess
si l'écriture d'un code beau et lisible est votre tasse de thé:
import subprocess
subprocess.Popen("rm -r my_dir", shell=True)
Et si vous n'êtes pas ingénieur logiciel, envisagez peut-être d'utiliser Jupyter; vous pouvez simplement taper les commandes bash:
!rm -r my_dir
Traditionnellement, vous utilisez shutil
:
import shutil
shutil.rmtree(my_dir)
subprocess
cela. shutil.rmtree
Est-ce que l' rm -r
emploi de très bien, avec l'avantage supplémentaire de travailler sur Windows.