Voglio eliminare il file filename
se esiste. È corretto dirlo
if os.path.exists(filename):
os.remove(filename)
Esiste un modo migliore? Un modo a una linea?
unlink
e inseriscila nello spazio dei nomi PHP.
Voglio eliminare il file filename
se esiste. È corretto dirlo
if os.path.exists(filename):
os.remove(filename)
Esiste un modo migliore? Un modo a una linea?
unlink
e inseriscila nello spazio dei nomi PHP.
Risposte:
Un modo più pitonico sarebbe:
try:
os.remove(filename)
except OSError:
pass
Anche se questo prende ancora più righe e sembra molto brutto, evita la chiamata non necessaria os.path.exists()
e segue la convenzione python di abusare delle eccezioni.
Potrebbe essere utile scrivere una funzione per fare questo per te:
import os, errno
def silentremove(filename):
try:
os.remove(filename)
except OSError as e: # this would be "except OSError, e:" before Python 2.6
if e.errno != errno.ENOENT: # errno.ENOENT = no such file or directory
raise # re-raise exception if a different error occurred
os.path.exists()
viene eseguito non significa che esiste quando os.remove()
viene eseguito.
Preferisco sopprimere un'eccezione piuttosto che verificare l'esistenza del file, per evitare un bug TOCTTOU . La risposta di Matt ne è un buon esempio, ma possiamo semplificarla leggermente in Python 3, usando contextlib.suppress()
:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
Se filename
è un pathlib.Path
oggetto anziché una stringa, possiamo chiamarne il .unlink()
metodo invece di usarlo os.remove()
. Nella mia esperienza, gli oggetti Path sono più utili delle stringhe per la manipolazione del filesystem.
Poiché tutto in questa risposta è esclusivo di Python 3, fornisce ancora un altro motivo per l'aggiornamento.
unlink(2)
, che è di gran lunga la più antica interfaccia rilevante qui.
except
clausola, allora dovresti usare try
/ except
. Non può essere abbreviato in modo significativo, perché è necessario disporre di una riga per introdurre il primo blocco, il blocco stesso, una riga per introdurre il secondo blocco e quindi quel blocco, quindi try
/ except
è già il più conciso possibile.
os.path.exists
ritorna True
per cartelle e file. Prendi in considerazione l'utilizzo os.path.isfile
per verificare l'esistenza del file.
Nello spirito della risposta di Andy Jones, che ne dici di un'autentica operazione ternaria:
os.remove(fn) if os.path.exists(fn) else None
A partire da Python 3.8, usa missing_ok=True
e pathlib.Path.unlink
( documenti qui )
from pathlib import Path
my_file = Path("./dir1/dir2/file.txt")
# Python 3.8+
my_file.unlink(missing_ok=True)
# Python 3.7 and earlier
if my_file.exists():
my_file.unlink()
Un altro modo per sapere se il file (o i file) esiste e per rimuoverlo è usare il modulo glob.
from glob import glob
import os
for filename in glob("*.csv"):
os.remove(filename)
Glob trova tutti i file che potrebbero selezionare il modello con un carattere jolly * nix e scorre l'elenco.
La risposta di Matt è quella giusta per i vecchi Python e Kevin è la risposta giusta per quelli più recenti.
Se si desidera non copiare la funzione per silentremove
, questa funzionalità è esposta in path.py come remove_p :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
è un liner.
Molti di voi potrebbero non essere d'accordo - probabilmente per ragioni come considerare brutto l'uso proposto di ternari - ma questo pone la domanda se dovremmo ascoltare le persone abituate a standard brutti quando chiamano qualcosa di "brutto" non standard.
In Python 3.4 o versione successiva, il modo pitone sarebbe:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
Qualcosa come questo? Sfrutta la valutazione del corto circuito. Se il file non esiste, l'intero condizionale non può essere vero, quindi Python non disturberà la valutazione della seconda parte.
os.path.exists("gogogo.php") and os.remove("gogogo.php")
Un'offerta KISS:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
E poi:
remove_if_exists("my.file")
Un'altra soluzione con il tuo messaggio in eccezione.
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
Ho usato rm
quale può forzare per eliminare i file inesistenti con --preserve-root
come opzione a rm
.
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
Possiamo anche usare safe-rm ( sudo apt-get install safe-rm
)
Safe-rm è uno strumento di sicurezza inteso a prevenire la cancellazione accidentale di file importanti sostituendo / bin / rm con un wrapper, che verifica gli argomenti forniti rispetto a una lista nera configurabile di file e directory che non devono mai essere rimossi.
Innanzitutto controllo se esiste il percorso della cartella / del file. Ciò impedirà di impostare la variabile fileToRemove /
folderToRemove to the string
-r / `.
import os, subprocess
fileToRemove = '/home/user/fileName';
if os.path.isfile(fileToRemove):
subprocess.run(['rm', '-f', '--preserve-root', fileToRemove]
subprocess.run(['safe-rm', '-f', fileToRemove]
rm
sicurezza e prevenire rm -r /
. @JonBrave
rm -f --preserve-root
non è abbastanza buono ( --preserve-root
è probabilmente il valore predefinito comunque). Ho dato -r /
come esempio , se fosse -r /home
o altro? Probabilmente vuoi rm -f -- $fileToRemove
, ma non è questo il punto.
os.system('rm ...')
è estremamente pericoloso, mi dispiace.