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?

TM.
fonte

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().

Jon-Eric
fonte
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()
mljrg
fonte
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

user3765030
fonte
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.

Varun Chhangani
fonte
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