¿cómo obtener contenido de un pequeño archivo ascii en python?
Digamos que queremos implementar un equivalente de PHP file_get_content
.
¿Cuál es la mejor práctica? (elegante y confiable)
Aquí hay alguna proposición, ¿son correctas?
Usando la instrucción with
:
def file_get_contents(filename):
with file(filename) as f:
s = f.read()
return s
¿Es seguro usar el estándar open()
?
def file_get_contents(filename):
return open(filename).read()
¿Qué sucede con el descriptor de archivo en cualquiera de las soluciones?
5 answers
En la implementación actual de CPython, ambos generalmente cerrarán inmediatamente el archivo. Sin embargo, Python el lenguaje no hace tal garantía para el segundo - el archivo eventualmente se cerrará, pero el finalizador puede no ser llamado hasta el siguiente ciclo gc. Implementaciones como Jython y IronPython funcionarán así, por lo que es una buena práctica cerrar explícitamente tus archivos.
Yo diría que usar la primera solución es la mejor práctica, aunque open
generalmente se prefiere a file
. Ten en cuenta que puedes acortarlo un poco si prefieres la brevedad del segundo ejemplo:
def file_get_contents(filename):
with open(filename) as f:
return f.read()
La parte __exit__
del administrador de contexto se ejecutará cuando abandone el cuerpo por cualquier razón, incluyendo excepciones y regresar de la función - no hay necesidad de usar una variable intermedia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-16 10:48:20
Usar la instrucción with es realmente la mejor manera de estar seguro de que el archivo está realmente cerrado.
Dependiendo del comportamiento del recolector de basura para esta tarea podría funcionar, pero en este caso, hay una buena manera de estar seguro en todos los casos, así que...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-16 10:47:45
import os
def file_get_contents(filename):
if os.path.exists(filename):
fp = open(filename, "r")
content = fp.read()
fp.close()
return content
Este caso devolverá None si el archivo no existe, y el descriptor de archivo se cerrará antes de salir de la función.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-16 10:29:12
with
se asegurará de que el archivo esté cerrado cuando se deje el bloque.
En su segundo ejemplo, el manejador de archivo puede permanecer abierto (Python no garantiza que esté cerrado o cuando no lo haga explícitamente).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-16 13:23:44
También puedes usar la función v3 de Python:
>>> ''.join(open('htdocs/config.php', 'r').readlines())
"This is the first line of the file.\nSecond line of the file"
Lea más aquí http://docs.python.org/py3k/tutorial/inputoutput.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-07 10:30:05