2012-06-21 8 views
13

Estoy tratando de comprender las compensaciones/diferencias entre estos a maneras de abrir los archivos para su procesamiento, línea por líneaprocesamiento de archivos línea por línea, para el bucle vs con

with open('data.txt') as inf: 
    for line in inf: 
     #etc 

vs

for line in open('data.txt'): 
    # etc 

entiendo que el uso de with garantiza que el archivo se cierra cuando se sale del "con el bloque" (suite?) (o una excepción es contrarrestada). Así que he estado usando with desde que me enteré aquí.

Re for -loop: desde la búsqueda alrededor de la red y así, parece que si el archivo se cierra cuando el for -loop se sale depende de la implementación? Y No pude encontrar nada sobre cómo esta construcción se ocuparía de las excepciones . ¿Alguien sabe?

Si estoy equivocado acerca de cualquier cosa por encima, le agradecería correcciones, de lo contrario no es una razón para usar siempre el constructo for sobre el with? (Suponiendo que tiene una opción, es decir, no están limitados por la versión de Python)

Respuesta

21

El problema con este

for line in open('data.txt'): 
    # etc 

es que usted no mantiene una referencia explícita en el archivo abierto, así que ¿cómo cerrarlo? La manera perezosa es esperar a que el recolector de basura lo limpie, pero eso puede significar que los recursos no se liberan de manera oportuna.

Por lo tanto se puede decir

inf = open('data.txt') 
for line in inf: 
    # etc 
inf.close() 

Ahora lo que sucede si hay una excepción mientras se encuentra dentro del bucle? El archivo no se cerrará explícitamente.

Añadir un try/finally

inf = open('data.txt') 
try: 
    for line in inf: 
     # etc 
finally: 
    inf.close() 

Se trata de una gran cantidad de código para hacer algo bastante simple, lo que Python añadió with para permitir que el código a ser escrito de una manera más fácil de leer. Lo que nos lleva a aquí

with open('data.txt') as inf: 
    for line in inf: 
     #etc 

Entonces, esa es la forma preferida de abrir el archivo. Si su Python es demasiado antiguo para la sentencia with, debe usar la versión try/finally para el código de producción

2

La declaración con solo se introdujo en Python 2.5, solo si tiene requisitos de compatibilidad con versiones anteriores si utiliza esta última. se introdujo

poco más claridad

La sentencia with (como usted es consciente) para abarcar el try/except/finally sistema - que no es excelente para comprender, pero está bien. En Python (el Python en C), la implementación de este cerrará los archivos abiertos. La especificación del lenguaje en sí no dice ... así que IPython, JPython, etc. pueden optar por mantener los archivos abiertos, la memoria abierta, lo que sea, y no los recursos gratuitos hasta el próximo ciclo de GC (o en absoluto, sino el CPython GC es diferente de los de .NET o Java ...).

Creo que la única cosa que he oído en contra de ella, es que añade otro nivel de sangría.

Entonces, para resumir: no va a funcionar < 2.5, introduce el 'como' palabra clave y añade un nivel de sangría.

De lo contrario, a mantener el control de excepciones de manipulación de la forma habitual, y por último el bloque de recursos se cierra si algo se escapa.

¡Trabaja para mí!

+0

Buen punto ... Debería haber puesto algo sobre cuándo puede elegir la pregunta, es decir, no está limitado por las versiones .. Actualizaré la pregunta. ¿Así que su voto iría a 'con' entonces? – Levon

+0

Creo que la sangría es un beneficio, ya que designa la sección que se encuentra en un contexto determinado. Tendría que sangrar de todos modos para envolver todo el bloque de una manera, excepto que cierra el archivo en el bloque final – jdi

+0

@jdl, pero déjenme saber que el problema de sangría no fue uno que yo planteé, solo uno que mencioné como tener lo noté hace años en listas y grupos. –

Cuestiones relacionadas