python - por - abrir leer y cerrar un archivo en 1 línea de código
leer archivo linea por linea python (10)
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 lo siguiente:
output = open(''pagehead.section.htm'',''r'').read()
Cuando utilizo la sintaxis anterior, ¿cómo cierro el archivo para liberar recursos del sistema?
Al usar more_itertools.with_iter
, es posible abrir, leer, cerrar y asignar una output
equivalente en una línea (excluyendo la instrucción 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, iteración diferida: esto se puede hacer usando un bloque tradicional o en el ejemplo anterior eliminando join()
e iterando el output
.
Con CPython, su archivo se cerrará inmediatamente después de que se ejecute la línea, porque el objeto del archivo se recoge inmediatamente. Sin embargo, hay dos inconvenientes:
En las implementaciones de Python diferentes de CPython, el archivo a menudo no se cierra inmediatamente, sino en un momento posterior, más allá de su control.
En Python 3.2 o superior, esto arrojará un
ResourceWarning
, si está habilitado.
Es mejor invertir una línea adicional:
with open(''pagehead.section.htm'',''r'') as f:
output = f.read()
Esto asegurará que el archivo esté correctamente cerrado en cualquier circunstancia.
El módulo Pathlib Python Standard Library hace lo que estás 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''
Frecuentemente hago algo como esto cuando necesito obtener algunas líneas que rodean algo que he grepped 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
Lo que puedes hacer es usar la declaración with
:
>>> with open(''pagehead.section.htm'', ''r'') as fin:
... output = fin.read()
La instrucción with
se ocupará de llamar a la función __exit__
del objeto dado incluso si algo malo sucedió en tu código; está cerca del try... finally
sintaxis. Para el objeto devuelto por open
, __exit__
corresponde al cierre del archivo.
Esta declaración se ha introducido con Python 2.6.
No es necesario importar ninguna biblioteca especial para hacer esto.
Use la sintaxis normal y se abrirá el archivo para leer y luego cerrarlo.
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 así:
for i in range(len(x)): print x[i]
Estas frases únicas son muy útiles para el mantenimiento, básicamente autodocumentadas.
Realmente no tienes que cerrarlo: Python lo hará automáticamente durante la recolección de basura o al salir del programa. Pero como lo señaló @delnan, es una mejor práctica cerrarlo explícitamente por varias razones.
Entonces, qué puedes hacer para mantenerlo corto, simple y explícito:
with open(''pagehead.section.htm'',''r'') as f:
output = f.read()
Ahora solo son dos líneas y bastante legibles, creo.
Si quieres esa sensación cálida y difusa, simplemente acepta.
Para python 3.6 ejecuté estos dos programas bajo un nuevo inicio de IDLE, dando tiempos de ejecución de:
0.002000093460083008 Test A
0.0020003318786621094 Test B: with guaranteed close
Entonces 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.
use ilio : (inline io):
solo una llamada de función en lugar de archivo abrir (), leer (), cerrar ().
from ilio import read
content = read(''filename'')
with open(''pagehead.section.htm'')as f:contents=f.read()