para la línea en abierto (nombre de archivo)


Con frecuencia veo código python similar a

for line in open(filename):
    do_something(line)

¿Cuándo se cierra filename con este código?

Sería mejor escribir

with open(filename) as f:
    for line in f.readlines():
        do_something(line)
Author: Sridhar Ratnakumar, 2009-09-25

4 answers

filename sería cerrado cuando cae fuera del alcance. Que normalmente sería el final del método.

Sí, es mejor usar with.

Una vez que tiene un objeto file, realiza todas las E/S de archivos llamando a los métodos de este objeto. [...] Cuando haya terminado con el archivo, debe terminar llamando al método close en el objeto, para cerrar la conexión al archivo:

input.close()

En scripts cortos, la gente a menudo omite este paso, ya que Python cierra automáticamente el archivo cuando un objeto de archivo es reclamado durante la recolección de basura (lo que en la corriente principal de Python significa que el archivo se cierra casi de una vez, aunque otras implementaciones importantes de Python, como Jython y IronPython, tienen otras estrategias de recolección de basura más relajadas). Sin embargo, es una buena práctica de programación para cerrar sus archivos tan pronto como sea posible, y es especialmente una buena idea en programas más grandes, que de lo contrario puede estar en mayor riesgo de tener un número excesivo de inútilmente abierto archivos que mienten. Tenga en cuenta que try/finally es particularmente adecuado para que un archivo se cierre, incluso cuando una función termina debido a una excepción no capturada.

Python Cookbook, Página 59.

 34
Author: Esteban Küber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-28 01:54:02

La parte with es mejor porque cierra el archivo después. Ni siquiera tienes que usar readlines(). for line in file es suficiente.

No creo que el primero lo cierre.

 8
Author: Loïc Wolff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-25 17:50:45

Drop .readlines(). Es redundante e indeseable para archivos grandes (debido al consumo de memoria). La variante con 'with' bloque siempre cierra el archivo.

with open(filename) as file_:
    for line in file_:
        do_something(line)

Cuando el archivo se cerrará en la variante de bucle desnudo 'for'-depende de la implementación de Python.

 5
Author: jfs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-25 19:18:21

Python es basura recolectada-cpython tiene conteo de referencias y un ciclo de backup detectando recolector de basura.

Los objetos de archivo cierran su controlador de archivo cuando se eliminan/finalizan.

Por lo tanto, el archivo se cerrará eventualmente, y en cpython se cerrará tan pronto como finalice el bucle for.

 2
Author: Douglas Leeder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-25 17:56:47