Como abrir / fechar arquivos com segurança em python 2.4


86

No momento, estou escrevendo um pequeno script para uso em um de nossos servidores usando Python. O servidor tem apenas Python 2.4.4 instalado.

Eu não comecei a usar Python até o lançamento do 2.5, então estou acostumado com o formulário:

with open('file.txt', 'r') as f:
    # do stuff with f

No entanto, não há nenhuma withdeclaração antes de 2.5, e estou tendo problemas para encontrar exemplos sobre a maneira adequada de limpar um objeto de arquivo manualmente.

Qual é a prática recomendada para descartar objetos de arquivo com segurança ao usar versões antigas do python?

Respostas:


139

Consulte docs.python.org :

Quando terminar de usar um arquivo, chame f.close () para fechá-lo e liberar todos os recursos do sistema usados ​​pelo arquivo aberto. Depois de chamar f.close (), as tentativas de usar o objeto de arquivo falharão automaticamente.

Portanto, use close()elegantemente com try/finally:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
    f.close()

Isso garante que, mesmo se # do stuff with flevantar uma exceção, fainda será fechado corretamente.

Observe que opendeve aparecer fora do try. Se openele próprio gerar uma exceção, o arquivo não foi aberto e não precisa ser fechado. Além disso, se opengerar uma exceção, seu resultado não será atribuído fe será um erro chamar f.close().


Muito simples, obrigado. Por alguma razão, eu esperava precisar de algo mais envolvido.
TM.

16
Se openfalhar, uma exceção será gerada antes mesmo de o try/finallybloco ser inserido. Portanto close, não será chamado. (É por isso que você deve ligar openantes do try.)
FogleBird

1
@TM Eu adicionei uma observação sobre como opencriar uma exceção.
Jon-Eric,

4
Isso é o que a declaração with se traduz nos bastidores.
Arlaharen,

1
A abertura do arquivo deve acontecer dentro da tentativa.
Anthony Rutledge

32

Na solução acima, repetida aqui:

f = open('file.txt', 'r')

try:
    # do stuff with f
finally:
   f.close()

se algo de ruim acontecer (nunca se sabe ...) depois de abrir o arquivo com sucesso e antes de tentar, o arquivo não será fechado, então uma solução mais segura é:

f = None
try:
    f = open('file.txt', 'r')

    # do stuff with f

finally:
    if f is not None:
       f.close()

Usando uma instrução with open (...), não importa como o bloco with esteja concluído (mesmo com uma exceção), o arquivo é fechado
darkgaze

@darkgaze with open(...)é definitivamente a melhor escolha em Python moderno.
mljrg

11

Não há necessidade de fechar o arquivo de acordo com os documentos se você usar com:

É uma boa prática usar a palavra-chave with ao lidar com objetos de arquivo. Isso tem a vantagem de que o arquivo é fechado corretamente após o término de seu conjunto, mesmo se uma exceção for levantada no caminho. Também é muito mais curto do que escrever blocos try-finally equivalentes:

>>> with open('workfile', 'r') as f:
...     read_data = f.read()
>>> f.closed
True

Mais aqui: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects


Isso é correto e alheio à questão.
Jon-Eric

-4

Aqui está um exemplo dado como usar opene "pythonclose

from sys import argv
script,filename=argv
txt=open(filename)
print "filename %r" %(filename)
print txt.read()
txt.close()
print "Change the file name"
file_again=raw_input('>')
print "New file name %r" %(file_again)
txt_again=open(file_again)
print txt_again.read()
txt_again.close()

É necessário quantas vezes você abriu o arquivo tem que fechar essas vezes.


1
Se uma exceção for levantada depois, openmas antes close, o arquivo não será fechado corretamente usando esta abordagem. Usar withou try/ finallyfecha o arquivo corretamente, mesmo na presença de exceções.
Jon-Eric
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.