Utilizará la lista de comprensión para leer un archivo de forma automática al llamar a close ()

¿La siguiente syntax cierra el archivo?

lines = [line.strip() for line in open('/somefile/somewhere')] 

Puntos de bonificación si puedes demostrar cómo funciona o no …

TIA!

Debe cerrar el archivo, sí, aunque cuando lo hace exactamente depende de la implementación. La razón es que no hay ninguna referencia al archivo abierto después del final de la comprensión de la lista, por lo que se recogerá la basura y eso cerrará el archivo.

En cpython (la versión de intérprete regular de python.org), sucederá de inmediato, ya que su recolector de basura funciona por conteo de referencias. En otro intérprete, como Jython o Iron Python, puede haber un retraso.

Si desea asegurarse de que su archivo se cierre, es mucho mejor usar una sentencia with :

 with open("file.txt") as file: lines = [line.strip() for line in file] 

Cuando termine el with , el archivo se cerrará. Esto es cierto incluso si se genera una excepción dentro de él.

Así es como debes hacerlo.

 with open('/somefile/somewhere') as f: lines = [line.strip() for line in f] 

En CPython, el archivo debe cerrarse de inmediato ya que no hay referencias a la izquierda, pero el lenguaje Python no lo garantiza .

En Jython, el archivo no se cerrará hasta que se ejecute el recolector de basura

No lo hará. Se puede utilizar un administrador de contexto para cerrarlo automáticamente. Por ejemplo:

 with open('/somefile/somewhere') as handle: lines = [line.strip() for line in handle] 

Esto es posible leer y cerrar un archivo en la lista de comprensión utilizando la biblioteca more_itertools 1 :

 import more_itertools as mit lines = [line.strip() for line in mit.with_iter(open("/somefile/somewhere"))] 

Tenga en cuenta que more_itertools es un paquete de terceros. Instalar vía pip install more_itertools .

Consulte también la documentación para obtener más información sobre more_itertools.with_iter .

Sí, porque el “abierto” no vincula el identificador de archivo a ningún objeto, se cerrará tan pronto como la comprensión de la lista esté completa y salga de su scope:

 #!/usr/bin/env python3 import psutil print('before anything, open files: ', end='') print(psutil.Process().open_files()) f = open('/etc/resolv.conf') print('after opening resolv.conf, open files: ', end='') print(psutil.Process().open_files()) f.close() print('after closing resolv.conf, open files: ', end='') print(psutil.Process().open_files()) print('reading /etc/services via a list comprehension') services = [ line.strip() for line in open('/etc/services') ] print('number of items in services: ', end='') print(len(services)) print('after reading /etc/services through list comp, open files: ', end='') print(psutil.Process().open_files())