Comment supprimer un fichier ou un dossier?

Réponses:

3348

Pathles objets du pathlibmodule Python 3.4+ exposent également ces méthodes d'instance:

RichieHindle
la source
5
os.rmdir () sous Windows supprime également le lien symbolique du répertoire même si le répertoire cible n'est pas vide
Lu55
8
Si le fichier n'existe pas, 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.
Ben Crowell
2
Je souhaite que Path.unlink 1 / soit récursif 2 / ajoute une option pour ignorer FileNotfoundError.
Jérôme
7
juste pour l'achèvement ... l'exception levée par os.remove()si un fichier n'existe pas est FileNotFoundError.
PedroA
Prend os.remove() plusieurs arguments pour supprimer plusieurs fichiers, ou appelez-vous chaque fois pour chaque fichier?
user742864
292

Syntaxe Python pour supprimer un 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()

Path.unlink (missing_ok = False)

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é.

Meilleur entrainement

  1. Vérifiez d'abord si le fichier ou le dossier existe ou non, puis supprimez uniquement ce fichier. Cela peut être réalisé de deux manières:
    a. os.path.isfile("/path/to/file")
    b. Utilisationexception 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)

Gestion des exceptions

#!/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))

SORTIE RESPECTIVE

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

Syntaxe Python pour supprimer un dossier

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))
anand tripathi
la source
13
La gestion des exceptions est recommandée par rapport à la vérification car le fichier peut être supprimé ou modifié entre les deux lignes (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use ) Voir la FAQ Python docs.python.org/3/glossary.html#term-eafp
Éric Araujo
84

Utilisation

shutil.rmtree(path[, ignore_errors[, onerror]])

(Voir documentation complète sur shutil ) et / ou

os.remove

et

os.rmdir

(Documentation complète sur os .)

Mihai Maruseac
la source
6
Veuillez ajouter l'interface pathlib (nouvelle depuis Python 3.4) à votre liste.
Paebbels
38

Voici une fonction robuste qui utilise à la fois os.removeet 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))
flycee
la source
8
C'est-à-dire 8 lignes de code pour simuler l' remove(path);appel ISO C.
Kaz
2
@Kaz a convenu ennuyeux, mais est-ce que supprimer les arbres? :-)
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
6
os.path.islink(file_path): un bug, devrait êtreos.path.islink(path):
Neo li
32

Vous pouvez utiliser le haut- pathlibmodule (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 unlinkméthode:

import pathlib
path = pathlib.Path(name_of_file)
path.unlink()

Ou la rmdirméthode pour supprimer un dossier vide :

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()
MSeifert
la source
2
Mais qu'en est-il d'un répertoire non vide?
Pranasas
@Pranasas Malheureusement, il semble qu'il n'y ait rien (nativement) pathlibqui 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.
MSeifert
30

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 unlinket 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 Pathobjets 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.rmtreeet notez qu'il est disponible en Python 2 et 3:

from shutil import rmtree

rmtree(dir_path)

Manifestation

Nouveau dans Python 3.4 est l' Pathobjet.

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

Python 2

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' Pathobjet (comme illustré ici):

from pathlib2 import Path

Si c'est trop, vous pouvez supprimer des fichiers avec os.removeouos.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.

Aaron Hall
la source
rmtree(directory_path)fonctionne en python 3.6.6 mais pas en python 3.5.2 - vous en avez besoin rmtree(str(directory_path))).
Stein
4
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)
Lalithesh
la source
1
Cela supprimera uniquement les fichiers à l'intérieur du dossier et des sous-dossiers, laissant la structure du dossier intacte ..
Lalithesh
4

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')
m0z4rt
la source
1
shutil.rmtreen'est pas censé être asynchrone. Cependant, il peut sembler être sur Windows avec des analyseurs de virus interférant.
mhsmith
@mhsmith Virus scanners ? Est-ce une spéculation sauvage, ou savez-vous réellement qu'ils peuvent provoquer cet effet? Comment ça marche si c'est le cas?
Mark Amery
2

Pour supprimer des fichiers:

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.

Pour supprimer des dossiers:

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.rmdirne fonctionne que lorsque le répertoire est vide et existe.

Pour supprimer les dossiers récursivement vers le parent:

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

Somnath Muluk
la source
1

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))
Sarender Reddy
la source
0

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.

Isaac Turner
la source
shutil.rmtree()supprime non seulement le répertoire mais aussi son contenu.
Tiago Martins Peres 李大仁
-1

Je recommande d'utiliser subprocesssi 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) 
Miladiouss
la source
3
Le sous-processus est une pratique à éviter
dlewin
3
Je ne recommanderais pas subprocesscela. shutil.rmtreeEst-ce que l' rm -remploi de très bien, avec l'avantage supplémentaire de travailler sur Windows.
Mark Amery