Abrir leer y cerrar un archivo en 1 línea de código

Ahora uso:

pageHeadSectionFile = open('pagehead.section.htm','r') output = pageHeadSectionFile.read() pageHeadSectionFile.close() 

Pero para hacer que el código se vea mejor, puedo hacer:

 output = open('pagehead.section.htm','r').read() 

Al usar la syntax anterior, ¿cómo cierro el archivo para liberar recursos del sistema?

Realmente no tiene que cerrarlo, Python lo hará automáticamente durante la recolección de basura o al salir del progtwig. Pero como señaló @delnan, es una mejor práctica cerrarla explícitamente por varias razones.

Entonces, qué puede hacer para que sea breve, simple y explícito:

 with open('pagehead.section.htm','r') as f: output = f.read() 

Ahora son solo dos líneas y bastante legibles, creo.

El módulo Pathlib de la biblioteca estándar de Python hace lo que está buscando:

 Path('pagehead.section.htm').read_text() 

No te olvides de importar ruta:

 jsk@dev1:~$ python3 Python 3.5.2 (default, Sep 10 2016, 08:21:44) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from pathlib import Path >>> (Path("/etc") / "hostname").read_text() 'dev1.example\n' 

En Python 27, instale backported pathlib o pathlib2

Al usar CPython, su archivo se cerrará inmediatamente después de que se ejecute la línea, ya que el objeto del archivo se recolecta de inmediato. Hay dos inconvenientes, sin embargo:

  1. En implementaciones de Python diferentes de CPython, el archivo a menudo no se cierra de inmediato, sino más tarde, más allá de su control.

  2. En Python 3.2 o superior, esto lanzará un ResourceWarning , si está habilitado.

Mejor invertir una línea adicional:

 with open('pagehead.section.htm','r') as f: output = f.read() 

Esto asegurará que el archivo se cierre correctamente en todas las circunstancias.

Lo que puedes hacer es usar la sentencia with :

 >>> with open('pagehead.section.htm', 'r') as fin: ... output = fin.read() 

La instrucción with se encargará de llamar a la función __exit__ del objeto dado, incluso si algo malo sucedió en su código; Está cerca del try... finally syntax. Para el objeto devuelto por open , __exit__ corresponde al cierre del archivo.

Esta statement se ha introducido con Python 2.6.

No es necesario importar bibliotecas especiales para hacer esto.

Use la syntax normal y abrirá el archivo para leerlo, luego lo cerrará.

 with open("/etc/hostname","r") as f: print f.read() 

o

 with open("/etc/hosts","r") as f: x = f.read().splitlines() 

que le da una matriz x que contiene las líneas, y se puede imprimir de la siguiente manera:

 for line in x: print line 

Estas líneas de una sola línea son muy útiles para el mantenimiento, básicamente se autodocumentan.

use ilio : (inline io):

solo una llamada de función en lugar de abrir archivo (), leer (), cerrar ().

 from ilio import read content = read('filename') 
 with open('pagehead.section.htm')as f:contents=f.read() 

Con frecuencia hago algo como esto cuando necesito algunas líneas alrededor de algo que he escrito en un archivo de registro:

 $ grep -n "xlrd" requirements.txt | awk -F ":" '{print $1}' 54 $ python -c "with open('requirements.txt') as file: print ''.join(file.readlines()[52:55])" wsgiref==0.1.2 xlrd==0.9.2 xlwt==0.7.5 

Usando more_itertools.with_iter , es posible abrir, leer, cerrar y asignar una output equivalente en una línea (excluyendo la statement de importación):

 import more_itertools as mit output = "".join(line for line in mit.with_iter(open("pagehead.section.htm", "r"))) 

Aunque es posible, buscaría otro enfoque que no sea asignar el contenido de un archivo a una variable, es decir, una iteración perezosa; esto se puede hacer usando un bloque tradicional o en el ejemplo anterior al eliminar join() y la iteración de output .

Si quieres ese sentimiento cálido y borroso, ve con eso.

Para Python 3.6 ejecuté estos dos progtwigs bajo un nuevo inicio de IDLE, dando tiempos de ejecución de:

 0.002000093460083008 Test A 0.0020003318786621094 Test B: with guaranteed close 

Así que no hay mucha diferencia.

 #--------*---------*---------*---------*---------*---------*---------*---------* # Desc: Test A for reading a text file line-by-line into a list #--------*---------*---------*---------*---------*---------*---------*---------* import sys import time # # MAINLINE if __name__ == '__main__': print("OK, starting program...") inTextFile = '/Users/Mike/Desktop/garbage.txt' # # Test: A: no 'with; c=[] start_time = time.time() c = open(inTextFile).read().splitlines() print("--- %s seconds ---" % (time.time() - start_time)) print("OK, program execution has ended.") sys.exit() # END MAINLINE 

SALIDA:

 OK, starting program... --- 0.002000093460083008 seconds --- OK, program execution has ended. #--------*---------*---------*---------*---------*---------*---------*---------* # Desc: Test B for reading a text file line-by-line into a list #--------*---------*---------*---------*---------*---------*---------*---------* import sys import time # # MAINLINE if __name__ == '__main__': print("OK, starting program...") inTextFile = '/Users/Mike/Desktop/garbage.txt' # # Test: B: using 'with' c=[] start_time = time.time() with open(inTextFile) as D: c = D.read().splitlines() print("--- %s seconds ---" % (time.time() - start_time)) print("OK, program execution has ended.") sys.exit() # END MAINLINE 

SALIDA:

 OK, starting program... --- 0.0020003318786621094 seconds --- OK, program execution has ended.