2009-09-25 9 views
22

frecuencia veo código Python similar apara la línea abierta en (nombre de archivo)

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

¿Cuándo se cierran nombre de fichero con el código?

¿Sería mejor escribir

with open(filename) as f: 
    for line in f.readlines(): 
     do_something(line) 

Respuesta

32

filename se cerrarán cuando se salga del alcance. Ese normalmente sería el final del método.

Sí, es mejor usar with.

Una vez que tiene un objeto de archivo, 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 con el archivo:

input.close() 

En guiones cortos, la gente a menudo omiten este paso, como Python cierra automáticamente el archivo cuando se recupera un objeto de archivo durante la recolección de basura (lo que en Python significa que el archivo se cierra al mismo tiempo, aunque otras implementaciones importantes de Python, como Jython e IronPython, tienen otras estrategias de recolección de basura más relajadas) Sin embargo, es una buena práctica de programación cerrar sus archivos lo antes posible, y es especialmente una buena idea en los programas más grandes, que de otra manera podrían estar en mayor riesgo de tener un número excesivo de archivos inútiles abiertos mintiendo. Tenga en cuenta que try/finally es especialmente adecuado para evitar que un archivo se cierre, incluso cuando una función finaliza debido a una excepción no detectada.

Python Cookbook, Page 59.

+0

Creo que quiere decir 'f' en lugar de' filename' en "' filename' se cerraría ... " –

+0

Quise decir que el objeto creado con' open (filename) 'se cerraría cuando caiga fuera del alcance , es decir, cuando termina la iteración. – voyager

+0

¿Se cerraría cuando termine el ciclo for o al final del método relevante? – foosion

9

La parte with es mejor, ya que cierre el archivo después. Ni siquiera tiene que usar readlines(). for line in file es suficiente.

No creo que el primero lo cierre.

2

Python es recolección de basura - CPython tiene recuento de referencias y un recolector de basura ciclo de copia de seguridad de la detección.

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

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

4

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

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

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

+0

Dex mencionó la eliminación de readlines() hace un tiempo. >> depende de la implementación de Python >> Esa podría ser la razón por la que diferentes personas dan respuestas diferentes. – foosion

Cuestiones relacionadas