Quiero eliminar el archivo filename
si existe. ¿Es correcto decir
if os.path.exists(filename):
os.remove(filename)
¿Hay una mejor manera? ¿Un camino de una línea?
unlink
y colóquela en el espacio de nombres PHP.
Quiero eliminar el archivo filename
si existe. ¿Es correcto decir
if os.path.exists(filename):
os.remove(filename)
¿Hay una mejor manera? ¿Un camino de una línea?
unlink
y colóquela en el espacio de nombres PHP.
Respuestas:
Una forma más pitónica 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 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
os.path.exists()
se ejecuta no significa que exista cuando os.remove()
se ejecuta.
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 en Python 3, usando contextlib.suppress()
:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
Si filename
es un pathlib.Path
objeto en lugar de una cadena, podemos llamar a su.unlink()
método en lugar de usar os.remove()
. En mi experiencia, los objetos Path son más útiles que las cadenas para la manipulación del sistema de archivos.
Como todo en esta respuesta es exclusivo de Python 3, proporciona otra razón más para actualizar.
unlink(2)
, que es, con mucho, la interfaz relevante más antigua aquí.
except
cláusula, entonces debe usar try
/ except
. No se puede acortar significativamente, porque debe tener una línea para introducir el primer bloque, el bloque en sí, una línea para introducir el segundo bloque, y luego ese bloque, por lo que try
/ except
es lo más breve posible.
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
A partir de Python 3.8, use missing_ok=True
y pathlib.Path.unlink
( documentos aquí )
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()
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.
La respuesta de Matt es la correcta para Pythons mayores y Kevin es la respuesta correcta para los más nuevos.
Si no desea copiar la función silentremove
, esta funcionalidad se expone en path.py como remove_p :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
es un trazador de líneas.
Muchos de ustedes pueden estar en desacuerdo, posiblemente por razones como considerar el uso propuesto de ternar "feo", pero esto plantea la pregunta de si debemos escuchar a las personas acostumbradas a los estándares feos cuando llaman a algo no estándar "feo".
En Python 3.4 o versión posterior, la forma pitónica sería:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
¿Algo como esto? Aprovecha la evaluación de cortocircuito. Si el archivo no existe, todo el condicional no puede ser verdadero, por lo que Python no molestará la evaluación de 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")
Otra solución con su propio mensaje en excepción.
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
He utilizado lo rm
que puede forzar la eliminación de archivos inexistentes con --preserve-root
una opción 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 contenedor, que verifica los argumentos dados contra una lista negra configurable de archivos y directorios que nunca deberían eliminarse.
Primero verifico si la ruta de la carpeta / archivo existe o no. Esto evitará establecer 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]
rm
forma segura y prevenir rm -r /
. @JonBrave
rm -f --preserve-root
no es lo suficientemente bueno ( --preserve-root
probablemente sea el valor predeterminado de todos modos). Di -r /
como ejemplo , ¿y si es -r /home
o lo que sea? Probablemente quieras rm -f -- $fileToRemove
, pero ese no es el punto.
os.system('rm ...')
es extremadamente peligroso, lo siento.