Ahora uso:
pageHeadSectionFile = open('pagehead.section.htm','r')
output = pageHeadSectionFile.read()
pageHeadSectionFile.close()
Pero para que el código se vea mejor, puedo hacer:
output = open('pagehead.section.htm','r').read()
Cuando uso la sintaxis anterior, ¿cómo cierro el archivo para liberar recursos del sistema?

contents = os.readfile(path). Si quisiera hacer algo más elegante, entonces bien, me encantaría usarlowith open(path) as fd: contents = fd.read(). Por supuesto, uno puede escribir su propio contenedor, pero para eso está el núcleo, para proporcionar lo útil a las abstracciones a los programadores.Respuestas:
Realmente no tiene que cerrarlo: Python lo hará automáticamente durante la recolección de basura o al salir del programa. Pero como señaló @delnan, es una mejor práctica cerrarlo explícitamente por varias razones.
Entonces, qué puede hacer para que sea breve, simple y explícito:
Ahora son solo dos líneas y bastante legible, creo.
fuente
withdeclaración, el recurso de archivo se cerrará correctamente para usted.output = f.read()pieza en la misma línea después de:.El módulo Pathlib de la biblioteca estándar de Python hace lo que está buscando:
No olvides importar Ruta:
En Python 27, instale backported
pathlibopathlib2fuente
withestán bien, perowithes una declaración, no una expresión. Estapathlibrespuesta es la única respuesta a la pregunta original que se puede incrustar en una expresión de Python. Algo así comoSECRET_KEY = os.environ.get('SECRET_KEY') or pathlib.Path('SECRET_KEY').read_bytes()Usando CPython, su archivo se cerrará inmediatamente después de que se ejecute la línea, porque el objeto del archivo se recolecta inmediatamente como basura. Sin embargo, hay dos inconvenientes:
En implementaciones de Python diferentes a CPython, el archivo a menudo no se cierra de inmediato, sino más tarde, 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:
Esto asegurará que el archivo se cierre correctamente en todas las circunstancias.
fuente
No es necesario importar ninguna biblioteca especial para hacer esto.
Use la sintaxis normal y abrirá el archivo para leerlo y luego lo cerrará.
o
que le da una matriz x que contiene las líneas, y puede imprimirse así:
Estas frases son muy útiles para el mantenimiento, básicamente autodocumentadas.
fuente
Lo que puede hacer es usar la
withdeclaración y escribir los dos pasos en una línea:La
withdeclaración se encargará de llamar a la__exit__función del objeto dado incluso si algo malo sucedió en su código; Está cerca de latry... finallysintaxis. Para el objeto devuelto poropen,__exit__corresponde al cierre del archivo.Esta declaración se ha introducido con Python 2.6.
fuente
withse introdujo en Python 2.5, pero tuvo que importarse explícitamente desde__future__. Se hizo disponible desde todos los contextos en Python 2.6.use ilio : (io en línea):
solo una llamada de función en lugar de abrir (), leer (), cerrar ().
fuente
fuente
python -cen la línea de comando, por lo que publicar respuestas de 2 líneas no ayuda.", usar;para agregar dos instrucciones y eliminar una nueva línea después:? La siguiente expresión funciona bien para mí:$> python -c "with open('some file', 'r') as f: print(next(f))"Creo que la forma más natural de lograr esto es definir una función.
Entonces puedes hacer lo siguiente:
fuente
Con frecuencia hago algo como esto cuando necesito obtener algunas líneas que rodean algo que he agrupado en un archivo de registro:
fuente
grep -A <n>,grep -B <n>ygrep -C <n>, si es útil. Más información: stackoverflow.com/a/9083/1830159Utilizando
more_itertools.with_iter, es posible abrir, leer, cerrar y asignar un equivalenteoutputen una línea (excluyendo la declaración de importación):Aunque es posible, buscaría otro enfoque que no sea asignar el contenido de un archivo a una variable, es decir, la iteración perezosa; esto se puede hacer usando un
withbloque tradicional o en el ejemplo anterior quitandojoin()e iterandooutput.fuente
"".join(line for line in __import__('more_itertools').with_iter(open("pagehead.section.htm", "r")))Esto funciona bien y elimina la necesidad de una línea para la importación.Si quieres esa sensación cálida y difusa, simplemente ve con .
Para Python 3.6 ejecuté estos dos programas bajo un nuevo comienzo de IDLE, dando tiempos de ejecución de:
Así que no hay mucha diferencia.
SALIDA:
SALIDA:
fuente