La forma más pirónica de eliminar un archivo que puede no existir

Quiero eliminar el filename del archivo si existe. Es correcto decir

 if os.path.exists(filename): os.remove(filename) 

¿Hay alguna manera mejor? Una forma de una línea?

Una forma más pythonica sería:

 try: os.remove(filename) except OSError: pass 

Aunque esto toma aún más líneas y se ve muy feo, evita la llamada innecesaria a os.path.exists() y sigue la convención de python de sobreutilizar excepciones.

Puede valer la pena escribir una función para hacer esto por usted:

 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 

Prefiero suprimir una excepción en lugar de verificar la existencia del archivo, para evitar un error TOCTTOU . La respuesta de Matt es un buen ejemplo de esto, pero podemos simplificarlo ligeramente bajo Python 3, usando contextlib.suppress() :

 import contextlib with contextlib.suppress(FileNotFoundError): os.remove(filename) 

Si filename es un objeto pathlib.Path lugar de una cadena, podemos llamar a su método .unlink() lugar de usar os.remove() . En mi experiencia, los objetos Path son más útiles que las cadenas para la manipulación de sistemas de archivos.

Dado que todo en esta respuesta es exclusivo de Python 3, proporciona otra razón para actualizar.

os.path.exists devuelve True para carpetas y archivos. Considere usar os.path.isfile para verificar si el archivo existe en su lugar.

En el espíritu de la respuesta de Andy Jones, ¿qué tal una auténtica operación ternaria?

 os.remove(fn) if os.path.exists(fn) else None 

Otra forma de saber si el archivo (o archivos) existe, y eliminarlo, es usando el módulo glob.

 from glob import glob import os for filename in glob("*.csv"): os.remove(filename) 

Glob encuentra todos los archivos que podrían seleccionar el patrón con un comodín * nix, y recorre la lista.

 if os.path.exists(filename): os.remove(filename) 

es de una sola línea.

Muchos de ustedes pueden estar en desacuerdo, posiblemente por razones como considerar el uso propuesto de los ternarios “feo”, pero esto plantea la cuestión de si debemos escuchar a las personas acostumbradas a los estándares feos cuando llaman a algo no estándar “feo”.

La respuesta de Matt es la correcta para los Pythons más antiguos y la respuesta correcta de Kevin para los más nuevos.

Si no desea copiar la función para silentremove , esta funcionalidad se expone en path.py como remove_p :

 from path import Path Path(filename).remove_p() 

En Python 3.4 o versión posterior, la forma pythonic sería:

 import os from contextlib import suppress with suppress(OSError): os.remove(filename) 

¿Algo como esto? Aprovecha la evaluación de corto circuito. Si el archivo no existe, el condicional completo no puede ser verdadero, por lo que Python no se molestará en evaluar la segunda parte.

 os.path.exists("gogogo.php") and os.remove("gogogo.php") 

Una oferta de KISS:

 def remove_if_exists(filename): if os.path.exists(filename): os.remove(filename) 

Y entonces:

 remove_if_exists("my.file") 

Esta es otra solución:

 if os.path.isfile(os.path.join(path, filename)): os.remove(os.path.join(path, filename)) 

He utilizado rm que puede forzar la eliminación de archivos inexistentes con --preserve-root como una opción para rm .

 --preserve-root do not remove `/' (default) 

 rm --help | grep "force" -f, --force ignore nonexistent files and arguments, never prompt 

También podemos usar safe-rm ( sudo apt-get install safe-rm )

Safe-rm es una herramienta de seguridad destinada a evitar la eliminación accidental de archivos importantes al reemplazar / bin / rm con un envoltorio, que verifica los argumentos dados contra una lista negra configurable de archivos y directorios que nunca deben eliminarse.

Primero verifico si la carpeta / ruta de archivo existe o no. Esto evitará configurar la variable 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]