Quero excluir o arquivo, filename
se existir. É apropriado dizer
if os.path.exists(filename):
os.remove(filename)
Existe uma maneira melhor? Uma maneira de uma linha?
unlink
e coloque-a no espaço para nome PHP.
Quero excluir o arquivo, filename
se existir. É apropriado dizer
if os.path.exists(filename):
os.remove(filename)
Existe uma maneira melhor? Uma maneira de uma linha?
unlink
e coloque-a no espaço para nome PHP.
Respostas:
Uma maneira mais pitônica seria:
try:
os.remove(filename)
except OSError:
pass
Embora isso exija ainda mais linhas e pareça muito feio, evita a chamada desnecessária os.path.exists()
e segue a convenção python de excessivas exceções.
Pode valer a pena escrever uma função para fazer isso por você:
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()
é executado não significa que ele existe quando os.remove()
é executado.
Prefiro suprimir uma exceção em vez de verificar a existência do arquivo, para evitar um bug do TOCTTOU . A resposta de Matt é um bom exemplo disso, mas podemos simplificá-lo um pouco no Python 3, usando contextlib.suppress()
:
import contextlib
with contextlib.suppress(FileNotFoundError):
os.remove(filename)
Se filename
é um pathlib.Path
objeto em vez de uma string, podemos chamar seu .unlink()
método em vez de usar os.remove()
. Na minha experiência, os objetos Path são mais úteis que as strings para manipulação do sistema de arquivos.
Como tudo nesta resposta é exclusivo do Python 3, ele fornece mais um motivo para a atualização.
unlink(2)
, que é de longe a interface relevante mais antiga aqui.
except
cláusula, deverá usar try
/ except
. Ele não pode ser significativamente reduzido, porque você deve ter uma linha para introduzir o primeiro bloco, o bloco em si, uma linha para introduzir o segundo bloco, e depois que o bloco, de modo try
/ except
já é tão concisa quanto possível.
os.path.exists
retorna True
para pastas e arquivos. Considere usar os.path.isfile
para verificar se o arquivo existe.
No espírito da resposta de Andy Jones, que tal uma autêntica operação ternária:
os.remove(fn) if os.path.exists(fn) else None
Outra maneira de saber se o arquivo (ou arquivos) existe e removê-lo é usando o módulo glob.
from glob import glob
import os
for filename in glob("*.csv"):
os.remove(filename)
O Glob encontra todos os arquivos que poderiam selecionar o padrão com um curinga * nix e faz um loop na lista.
No Python 3.8, use missing_ok=True
e pathlib.Path.unlink
( docs aqui )
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()
A resposta de Matt é o caminho certo para Pythons mais velhos e Kevin é a resposta certa para os mais novos.
Se você não deseja copiar a função silentremove
, essa funcionalidade é exposta em path.py como remove_p :
from path import Path
Path(filename).remove_p()
if os.path.exists(filename): os.remove(filename)
é um one-liner.
Muitos de vocês podem discordar - possivelmente por razões como considerar o uso proposto de ternários "feio" - mas isso levanta a questão de saber se devemos ouvir as pessoas acostumadas a padrões feios quando chamam algo não-padrão de "feio".
No Python 3.4 ou versão posterior, a maneira pitônica seria:
import os
from contextlib import suppress
with suppress(OSError):
os.remove(filename)
Algo assim? Aproveita a avaliação de curto-circuito. Se o arquivo não existir, toda a condicional não poderá ser verdadeira; portanto, o python não incomodará a avaliação da segunda parte.
os.path.exists("gogogo.php") and os.remove("gogogo.php")
Uma oferta do KISS:
def remove_if_exists(filename):
if os.path.exists(filename):
os.remove(filename)
E depois:
remove_if_exists("my.file")
Outra solução com sua própria mensagem em exceção.
import os
try:
os.remove(filename)
except:
print("Not able to delete the file %s" % filename)
Eu usei o rm
que pode forçar a excluir arquivos inexistentes com --preserve-root
como uma opção para rm
.
--preserve-root
do not remove `/' (default)
rm --help | grep "force"
-f, --force ignore nonexistent files and arguments, never prompt
Também podemos usar safe-rm ( sudo apt-get install safe-rm
)
O Safe-rm é uma ferramenta de segurança destinada a impedir a exclusão acidental de arquivos importantes, substituindo / bin / rm por um wrapper, que verifica os argumentos fornecidos em uma lista negra configurável de arquivos e diretórios que nunca devem ser removidos.
Primeiro, verifico se o caminho da pasta / arquivo existe ou não. Isso impedirá a configuração da variável 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
com segurança e evitar rm -r /
. @JonBrave
rm -f --preserve-root
não é bom o suficiente ( --preserve-root
provavelmente é o padrão de qualquer maneira). Dei -r /
como exemplo , e se for -r /home
ou o que for? Você provavelmente quer rm -f -- $fileToRemove
, mas esse não é o ponto.
os.system('rm ...')
é extremamente perigoso, desculpe.