procesamiento de archivos línea por línea, for-loop vs with

Estoy tratando de entender las compensaciones / diferencias entre estos y las formas de abrir archivos para el procesamiento línea por línea.

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

vs

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

Entiendo que usar with asegura que el archivo se cierre cuando se sale de “with-block” (suite?) (O se contrarresta una excepción). Así que lo he estado usando desde que lo aprendí aquí.

Re for -loop: de buscar alrededor de la red y SO, parece que si el archivo está cerrado cuando se sale de for loop depende de la implementación. Y no pude encontrar nada sobre cómo esta construcción trataría con las excepciones. ¿Alguien sabe?

Si me equivoco con algo de lo anterior, apreciaría las correcciones, de lo contrario, ¿hay alguna razón para usar el constructo for encima del with ? (Suponiendo que tiene una opción, es decir, no está limitado por la versión de Python)

El problema con esto

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

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

Así que puedes decir

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

Ahora, ¿qué sucede si hay una excepción mientras estás dentro del bucle for? 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() 

Este es un montón de código para hacer algo bastante simple, por lo que Python se agregó para permitir que este código se escriba de una manera más legible. Lo que nos lleva hasta aquí

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

Por lo tanto, esa es la forma preferida de abrir el archivo. Si su Python es demasiado viejo para la statement with, debe usar la versión try/finally para el código de producción

La statement with solo se introdujo en Python 2.5, solo si tiene requisitos de compatibilidad con versiones anteriores para versiones anteriores, en caso de usar esta última.

Un poco más de claridad

La instrucción with se introdujo (como usted sabe) para abarcar el sistema try / except / finally – lo cual no es excelente de entender, pero está bien. En Python (el Python en C), su implementación cerrará los archivos abiertos. La especificación del lenguaje en sí no dice … por lo que IPython, JPython, etc … pueden optar por mantener los archivos abiertos, la memoria abierta, lo que sea, y no liberar recursos hasta el próximo ciclo de GC (o en absoluto, pero CPython GC es diferente de .NET o Java …).

Creo que lo único que he escuchado en contra es que agrega otro nivel de sangría.

Para resumir: no funcionará <2.5, introduce la palabra clave 'como' y agrega un nivel de sangría.

De lo contrario, mantendrá el control del manejo de las excepciones como de costumbre, y el bloque finalmente cierra los recursos si algo se escapa.

¡Funciona para mi!

 import os path = "c:\\fio" longer_path = "c:\\fio\\" # Read every file in directory for filename in os.listdir(path): print() print("Here is the file name",filename) inf = open(longer_path+filename) try: for line in inf: print(line,end='') finally: inf.close() #output Here is the file name a.txt mouse apple Here is the file name New Text Document - Copy.txt cat Here is the file name New Text Document.txt dog