3473 votes

Comment supprimer un fichier ou un dossier en Python ?

Comment supprimer un fichier ou un dossier ?

50voto

MSeifert Points 6307

Vous pouvez utiliser la fonction intégrée pathlib (nécessite Python 3.4+, mais il existe des backports pour les versions plus anciennes sur PyPI : pathlib , pathlib2 ).

Pour supprimer un fichier, il existe la fonction unlink méthode :

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

Ou le rmdir pour supprimer une vide dossier :

import pathlib
path = pathlib.Path(name_of_folder)
path.rmdir()

11 votes

Mais qu'en est-il d'un répertoire non vide ?

2 votes

@Pranasas Malheureusement, il semble qu'il n'y ait rien (en natif) dans l'application pathlib qui peut gérer la suppression des répertoires non vides. Cependant, vous pouvez utiliser shutil.rmtree . Elle a été mentionnée dans plusieurs autres réponses et je ne l'ai donc pas incluse.

44voto

Aaron Hall Points 7381

Comment supprimer un fichier ou un dossier en Python ?

Pour Python 3, pour supprimer le fichier et le répertoire individuellement, utilisez la commande unlink y rmdir Path respectivement :

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 Path et vous pouvez vérifier votre répertoire de travail actuel avec Path.cwd .

Pour la suppression de fichiers et de répertoires individuels dans Python 2, voir la section correspondante ci-dessous.

Pour supprimer un répertoire avec son contenu, utilisez shutil.rmtree et notez que cette fonction est disponible dans Python 2 et 3 :

from shutil import rmtree

rmtree(dir_path)

Démonstration

La nouveauté de Python 3.4 est la fonction Path objet.

Utilisons-en un pour créer un répertoire et un fichier afin de démontrer son utilisation. Notez que nous utilisons l'option / pour joindre les parties du chemin, ce qui permet de contourner les problèmes entre les systèmes d'exploitation et les problèmes liés à l'utilisation des barres obliques inverses sous Windows (où vous devez soit doubler vos barres obliques inverses, comme par exemple \\ ou 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

Maintenant, il faut les supprimer. 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, il suffit d'itérer sur le motif global :

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

Que faire si l'on veut supprimer un répertoire et tout ce qu'il contient ? Pour ce cas d'utilisation, utilisez shutil.rmtree

Recréons notre répertoire et notre fichier :

file_path.parent.mkdir()
file_path.touch()

et notez que 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 on peut voir que tout a été enlevé :

>>> directory_path.exists()
False

Python 2

Si vous êtes sous Python 2, il existe une fonction backport du module pathlib appelé pathlib2 qui peut être installé avec pip :

$ pip install pathlib2

Et ensuite vous pouvez aliaser la bibliothèque à pathlib

import pathlib2 as pathlib

Ou simplement importer directement le Path (comme démontré ici) :

from pathlib2 import Path

Si c'est trop, vous pouvez supprimer des fichiers avec os.remove ou os.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 ne supprime que les répertoires vides de manière récursive, mais cela peut convenir à votre cas d'utilisation.

0 votes

rmtree(directory_path) fonctionne dans python 3.6.6 mais pas dans python 3.5.2 - vous avez besoin de rmtree(str(directory_path))) là.

11voto

Daring_T Points 76

C'est ma fonction pour supprimer les répertoires. Le "path" nécessite le nom de chemin complet.

import os

def rm_dir(path):
    cwd = os.getcwd()
    if not os.path.exists(os.path.join(cwd, path)):
        return False
    os.chdir(os.path.join(cwd, path))

    for file in os.listdir():
        print("file = " + file)
        os.remove(file)
    print(cwd)
    os.chdir(cwd)
    os.rmdir(os.path.join(cwd, path))

10voto

Tr.Crab Points 51

Shutil.rmtree est la fonction asynchrone, donc si vous voulez vérifier quand elle est terminée, vous pouvez utiliser la boucle while...loop.

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')

1 votes

shutil.rmtree n'est pas censé être asynchrone. Cependant, il peut sembler l'être sous Windows, avec l'interférence des scanners de virus.

1 votes

@mhsmith Scanners de virus ? Est-ce une pure spéculation, ou savez-vous réellement qu'ils peuvent provoquer cet effet ? Et si c'est le cas, comment cela fonctionne-t-il ?

8voto

Lalithesh Points 124
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)

1 votes

Cela supprimera uniquement les fichiers contenus dans le dossier et les sous-dossiers, en laissant la structure du dossier intacte

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X