¿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?

 31
Author: vaab, 2009-09-16

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.

 43
Author: Brian,
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...

 3
Author: Jonathan Ballet,
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.

 2
Author: amrhassan,
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).

 2
Author: Aaron Digulla,
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

 0
Author: Argimko,
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