Pregunta 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 lo siguiente:

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

Cuando utilizo la sintaxis anterior, ¿cómo cierro el archivo para liberar recursos del sistema?


73
2017-11-04 15:34


origen


Respuestas:


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.


117
2017-11-04 15:37



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.


17
2017-11-04 15:38



Biblioteca estándar de Python Pathlib módulo 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 instalar backported pathlib o pathlib2


15
2017-11-11 16:11



Lo que puedes hacer es usar el with declaración:

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

los with declaración se encargará de llamar __exit__ función del objeto dado incluso si algo malo sucedió en tu código; está cerca de la try... finally sintaxis. Para objeto devuelto por open, __exit__ corresponde al cierre del archivo.

Esta declaración se ha introducido con Python 2.6.


9
2017-11-04 15:39



utilizar Ilio: (en línea io):

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

from ilio import read

content = read('filename')

6
2017-08-21 13:42



with open('pagehead.section.htm')as f:contents=f.read()

3
2017-12-23 14:47



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.


2
2017-09-10 05:21



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

0
2018-02-06 18:19



Utilizando more_itertools.with_iter, es posible abrir, leer, cerrar y asignar un equivalente output en una línea (excluyendo el extracto 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 la asignación del contenido de un archivo a una variable, es decir, la iteración diferida: esto se puede hacer utilizando un método tradicional. with bloquear o en el ejemplo anterior mediante la eliminación join() e iterando output.


0
2017-08-29 01:24



Si quieres esa sensación cálida y difusa simplemente sigue con con.

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.

0
2018-02-01 14:14



Curiosamente, nadie mencionó esto.

No me importa tener una función simple almacenada en algún lugar, que solo escriba una en la vida:

def readAndClose(fileName):
    f = open(filename,'r')
    val = f.read()
    f.close()
    return val

Entonces el resto es bastante fácil:

textFromFile = readAndClose(fileName)

0
2017-07-26 02:39