Quero excluir o arquivo, filenamese existir. É apropriado dizer
if os.path.exists(filename):
os.remove(filename)
Existe uma maneira melhor? Uma maneira de uma linha?
unlinke coloque-a no espaço para nome PHP.
Quero excluir o arquivo, filenamese existir. É apropriado dizer
if os.path.exists(filename):
os.remove(filename)
Existe uma maneira melhor? Uma maneira de uma linha?
unlinke 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.Pathobjeto 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.
exceptclá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/ exceptjá é tão concisa quanto possível.
os.path.existsretorna Truepara pastas e arquivos. Considere usar os.path.isfilepara 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=Truee 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 rmque pode forçar a excluir arquivos inexistentes com --preserve-rootcomo 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]
rmcom segurança e evitar rm -r /. @JonBrave
rm -f --preserve-rootnão é bom o suficiente ( --preserve-rootprovavelmente é o padrão de qualquer maneira). Dei -r / como exemplo , e se for -r /homeou o que for? Você provavelmente quer rm -f -- $fileToRemove, mas esse não é o ponto.
os.system('rm ...')é extremamente perigoso, desculpe.