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
with
declaració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
pathlib
opathlib2
fuente
with
están bien, perowith
es una declaración, no una expresión. Estapathlib
respuesta 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
with
declaración y escribir los dos pasos en una línea:La
with
declaració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... finally
sintaxis. Para el objeto devuelto poropen
,__exit__
corresponde al cierre del archivo.Esta declaración se ha introducido con Python 2.6.
fuente
with
se 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 -c
en 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 equivalenteoutput
en 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
with
bloque 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