Cómo abrir / cerrar archivos de forma segura en python 2.4

86

Actualmente estoy escribiendo un pequeño script para usar en uno de nuestros servidores usando Python. El servidor solo tiene instalado Python 2.4.4.

No comencé a usar Python hasta que salió 2.5, así que estoy acostumbrado al formulario:

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

Sin embargo, no hay una withdeclaración antes de la 2.5 y tengo problemas para encontrar ejemplos sobre la forma correcta de limpiar un objeto de archivo manualmente.

¿Cuál es la mejor práctica para eliminar objetos de archivo de forma segura cuando se utilizan versiones antiguas de Python?

TM.
fuente

Respuestas:

139

Consulte docs.python.org :

Cuando haya terminado con un archivo, llame a f.close () para cerrarlo y liberar los recursos del sistema ocupados por el archivo abierto. Después de llamar a f.close (), los intentos de usar el objeto de archivo fallarán automáticamente.

Por lo tanto, close()úselo elegantemente con try/finally:

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

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

Esto asegura que incluso si # do stuff with fgenera una excepción, fse cerrará correctamente.

Tenga en cuenta que opendebería aparecer fuera del try. Si él openmismo genera una excepción, el archivo no se abrió y no necesita cerrarse. Además, si opengenera una excepción, su resultado no se asigna fy es un error llamar f.close().

Jon-Eric
fuente
Muy simple, gracias. Por alguna razón esperaba que necesitaría algo más involucrado.
TM.
16
Si openfalla, se generará una excepción try/finallyincluso antes de ingresar al bloque. Por closeeso no se llamará. (Es por eso que debe llamar openantes del try.)
FogleBird
1
@TM Agregué una nota sobre cómo opengenerar una excepción.
Jon-Eric
4
Esto es lo que la declaración with se traduce detrás de escena.
Arlaharen
1
La apertura del archivo debería ocurrir dentro del intento.
Anthony Rutledge
32

En la solución anterior, repetida aquí:

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

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

si sucede algo malo (nunca se sabe ...) después de abrir el archivo correctamente y antes del intento, el archivo no se cerrará, por lo que una solución más segura es:

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

    # do stuff with f

finally:
    if f is not None:
       f.close()
mljrg
fuente
Usando una declaración with open (...), no importa cómo termine el bloque with (incluso con una excepción), el archivo está cerrado
darkgaze
@darkgaze with open(...)es definitivamente la mejor opción en Python moderno.
mljrg
11

No es necesario cerrar el archivo de acuerdo con los documentos si lo usa con:

Es una buena práctica utilizar la palabra clave with cuando se trata de objetos de archivo. Esto tiene la ventaja de que el archivo se cierra correctamente después de que finaliza su suite, incluso si se genera una excepción en el camino. También es mucho más corto que escribir bloques de prueba-finalmente equivalentes:

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

Más aquí: https://docs.python.org/2/tutorial/inputoutput.html#methods-of-file-objects

usuario3765030
fuente
Esto es correcto y ajeno a la pregunta.
Jon-Eric
-4

A continuación, se muestra un ejemplo sobre cómo usar openy "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()

Es necesario saber cuántas veces ha abierto el archivo para cerrar ese tiempo.

Varun Chhangani
fuente
1
Si se genera una excepción después openpero antes close, el archivo no se cerrará correctamente con este enfoque. Usar witho try/ finallycierra el archivo correctamente incluso en presencia de excepciones.
Jon-Eric