una por linea leer especifica archivo python readfile

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:

  1. 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.

  2. 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''

En Python 27 instale backported pathlib o pathlib2


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()