Come eliminare un file o una cartella?


Risposte:


3347

Pathgli oggetti del pathlibmodulo Python 3.4+ espongono anche questi metodi di istanza:


5
os.rmdir () su Windows rimuove anche il collegamento simbolico della directory anche se la directory di destinazione non è vuota
Lu55

8
Se il file non esiste, os.remove()genera un'eccezione, quindi potrebbe essere necessario verificare os.path.isfile()prima o racchiudere in a try.
Ben Crowell,

2
Vorrei Path.unlink 1 / era ricorsivo 2 / aggiungere un'opzione per ignorare FileNotfoundError.
Jérôme,

7
solo per completamento ... l'eccezione generata os.remove()se un file non esiste è FileNotFoundError.
PedroA

Accetta os.remove() più argomenti per eliminare più file o lo chiami ogni volta per ogni file?
user742864

292

Sintassi Python per eliminare un file

import os
os.remove("/tmp/<file_name>.txt")

O

import os
os.unlink("/tmp/<file_name>.txt")

O

libreria pathlib per versione Python> 3.5

file_to_rem = pathlib.Path("/tmp/<file_name>.txt")
file_to_rem.unlink()

Path.unlink (missing_ok = False)

Metodo di scollegamento utilizzato per rimuovere il file o il collegamento symbolik.

Se missing_ok è falso (impostazione predefinita), FileNotFoundError viene generato se il percorso non esiste.
Se missing_ok è true, le eccezioni FileNotFoundError verranno ignorate (stesso comportamento del comando rm -f POSIX).
Modificato nella versione 3.8: è stato aggiunto il parametro missing_ok.

La migliore pratica

  1. Innanzitutto, controlla se il file o la cartella esiste o meno, quindi elimina solo quel file. Ciò può essere ottenuto in due modi:
    a. os.path.isfile("/path/to/file")
    b. Usoexception handling.

ESEMPIO peros.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)

La gestione delle eccezioni

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

RISPOSTA RISPETTIVA

Immettere il nome del file da eliminare: demo.txt
Errore: demo.txt - Nessun file o directory.

Immettere il nome del file da eliminare: rrr.txt
Errore: rrr.txt - Operazione non consentita.

Immettere il nome del file da eliminare: foo.txt

Sintassi di Python per eliminare una cartella

shutil.rmtree()

Esempio per 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))

13
Si consiglia la gestione delle eccezioni rispetto al controllo perché il file potrebbe essere rimosso o modificato tra le due righe (TOCTOU: en.wikipedia.org/wiki/Time_of_check_to_time_of_use ) Vedi le FAQ di Python docs.python.org/3/glossary.html#term-eafp
Éric Araujo,

84

Uso

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

(Vedi documentazione completa su shutil ) e / o

os.remove

e

os.rmdir

(Documentazione completa su OS .)


6
Aggiungi l'interfaccia pathlib (nuova da Python 3.4) al tuo elenco.
Paebbels,

38

Ecco una solida funzione che utilizza sia os.removee 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))

8
Vale a dire 8 righe di codice per simulare la remove(path);chiamata ISO C.
Kaz,

2
@Kaz ha accettato fastidioso, ma rimuove il problema con gli alberi? :-)
Ciro Santilli 8 冠状 病 六四 事件 法轮功

6
os.path.islink(file_path): un bug, dovrebbe essereos.path.islink(path):
Neo li

32

È possibile utilizzare il built-in pathlibmodulo (richiede Python 3.4+, ma ci sono backport per le vecchie versioni di PyPI: pathlib, pathlib2).

Per rimuovere un file c'è il unlinkmetodo:

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

O il rmdirmetodo per rimuovere una cartella vuota :

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

2
Che dire di una directory non vuota però?
Pranasas,

@Pranasas Sfortunatamente sembra che non ci sia nulla (nativamente) in pathlibgrado di gestire la cancellazione di directory non vuote. Comunque potresti usare shutil.rmtree. È stato menzionato in molte altre risposte, quindi non l'ho incluso.
MSeifert,

30

Come cancello un file o una cartella in Python?

Per Python 3, per rimuovere il file e la directory singolarmente, utilizzare rispettivamente i metodi unlinke 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

Nota che puoi anche usare percorsi relativi con Pathoggetti e puoi controllare la tua directory di lavoro corrente con Path.cwd.

Per rimuovere singoli file e directory in Python 2, vedere la sezione così etichettata di seguito.

Per rimuovere una directory con contenuti, utilizzare shutil.rmtreee notare che è disponibile in Python 2 e 3:

from shutil import rmtree

rmtree(dir_path)

Dimostrazione

Nuovo in Python 3.4 è l' Pathoggetto.

Usiamo uno per creare una directory e un file per dimostrare l'utilizzo. Nota che usiamo il /per unire le parti del percorso, questo risolve i problemi tra i sistemi operativi e i problemi derivanti dall'uso di barre rovesciate su Windows (dove è necessario raddoppiare le barre rovesciate come \\o utilizzare stringhe non elaborate , come 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()

e adesso:

>>> file_path.is_file()
True

Ora eliminiamoli. Innanzitutto il file:

>>> file_path.unlink()     # remove file
>>> file_path.is_file()
False
>>> file_path.exists()
False

Possiamo usare globbing per rimuovere più file: prima creiamo alcuni file per questo:

>>> (directory_path / 'foo.my').touch()
>>> (directory_path / 'bar.my').touch()

Quindi ripeti semplicemente il pattern 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

Ora, dimostrando di rimuovere la directory:

>>> directory_path.rmdir() # remove directory
>>> directory_path.is_dir()
False
>>> directory_path.exists()
False

Cosa succede se vogliamo rimuovere una directory e tutto ciò che contiene? Per questo caso d'uso, utilizzareshutil.rmtree

Ricreamo la nostra directory e file:

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

e nota che rmdirfallisce a meno che non sia vuoto, motivo per cui rmtree è così conveniente:

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

Ora, importa rmtree e passa la directory alla funzione:

from shutil import rmtree
rmtree(directory_path)      # remove everything 

e possiamo vedere che tutto è stato rimosso:

>>> directory_path.exists()
False

Python 2

Se sei su Python 2, c'è un backport del modulo pathlib chiamato pathlib2 , che può essere installato con pip:

$ pip install pathlib2

E poi puoi alias la libreria a pathlib

import pathlib2 as pathlib

O semplicemente importare direttamente l' Pathoggetto (come mostrato qui):

from pathlib2 import Path

Se è troppo, puoi rimuovere i file con os.removeoos.unlink

from os import unlink, remove
from os.path import join, expanduser

remove(join(expanduser('~'), 'directory/file'))

o

unlink(join(expanduser('~'), 'directory/file'))

e puoi rimuovere le directory con os.rmdir:

from os import rmdir

rmdir(join(expanduser('~'), 'directory'))

Si noti che esiste anche un os.removedirs: rimuove ricorsivamente solo directory vuote, ma potrebbe adattarsi al caso d'uso.


rmtree(directory_path)funziona in Python 3.6.6 ma non in Python 3.5.2 - è necessario rmtree(str(directory_path)))lì.
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)

1
Questo eliminerà solo i file all'interno della cartella e delle sottocartelle lasciando intatta la struttura delle cartelle.
Lalithesh,

4

shutil.rmtree è la funzione asincrona, quindi se vuoi controllare quando è completo, puoi usare while ... loop

import os
import shutil

shutil.rmtree(path)

while os.path.exists(path):
  pass

print('done')

1
shutil.rmtreenon dovrebbe essere asincrono. Tuttavia, potrebbe sembrare che sia su Windows con gli scanner antivirus che interferiscono.
mhsmith,

Scanner di virus @mhsmith ? È una speculazione selvaggia o sai davvero che possono causare questo effetto? Come mai funziona così?
Mark Amery,

2

Per eliminare i file:

os.unlink(path, *, dir_fd=None)

o

os.remove(path, *, dir_fd=None)

Entrambe le funzioni sono semanticamente uguali. Questa funzione rimuove (elimina) il percorso del file. Se path non è un file ed è una directory, viene sollevata un'eccezione.

Per eliminare le cartelle:

shutil.rmtree(path, ignore_errors=False, onerror=None)

o

os.rmdir(path, *, dir_fd=None)

Per rimuovere interi alberi di directory, è shutil.rmtree()possibile utilizzare. os.rmdirfunziona solo quando la directory è vuota ed esiste.

Per eliminare le cartelle in modo ricorsivo verso parent:

os.removedirs(name)

Rimuove ogni directory padre vuota con sé fino a quando padre ha del contenuto

ex. os.removedirs ('abc / xyz / pqr') rimuoverà le directory ordinando 'abc / xyz / pqr', 'abc / xyz' e 'abc' se sono vuote.

Per ulteriori informazioni controllo doc ufficiale: os.unlink, os.remove, os.rmdir, shutil.rmtree,os.removedirs


1

Per rimuovere tutti i file nella cartella

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)

Per rimuovere tutte le cartelle in una directory

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

0

Per evitare il problema TOCTOU evidenziato dal commento di Éric Araujo , puoi prendere un'eccezione per chiamare il metodo corretto:

def remove_file_or_dir(path: str) -> None:
    """ Remove a file or directory """
    try:
        shutil.rmtree(path)
    except NotADirectoryError:
        os.remove(path)

Dal momento che shutil.rmtree()rimuoverà solo le directory e os.remove()o os.unlink()rimuoverà solo i file.


shutil.rmtree()rimuove non solo la directory ma anche il suo contenuto.
Tiago Martins Peres

-1

Ti consiglio di usare subprocessse scrivere un codice bellissimo e leggibile è la tua tazza di tè:

import subprocess
subprocess.Popen("rm -r my_dir", shell=True)

E se non sei un ingegnere del software, forse potresti prendere in considerazione l'utilizzo di Jupyter; puoi semplicemente digitare i comandi bash:

!rm -r my_dir

Tradizionalmente, usi shutil:

import shutil
shutil.rmtree(my_dir) 

3
Il sottoprocesso è pratica da evitare
dlewin

3
Non lo consiglierei subprocessper questo. shutil.rmtreefa rm -rbene il lavoro, con l'ulteriore vantaggio di lavorare su Windows.
Mark Amery,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.