En Ruby puedes leer desde un archivo usando s = File.read(filename)
. El más corto y claro que conozco en Python es
with open(filename) as f:
s = f.read()
¿Hay alguna otra forma de hacerlo que lo haga aún más corto (preferiblemente una línea) y más legible?
Nota: inicialmente formulé la pregunta como "hacer esto en una sola línea de código". Como señaló S.Lott, más corto no significa necesariamente más legible. Así que reformulé mi pregunta solo para aclarar lo que quería decir. Creo que el código Ruby es mejor y más legible no necesariamente porque es una línea frente a dos (aunque eso también importa), sino también porque es un método de clase en lugar de un método de instancia, que no plantea dudas sobre quién cierra el archivo, cómo asegurarse de que se cierre incluso si se genera una excepción, etc. Como se señala en las respuestas a continuación, puede confiar en el GC para cerrar su archivo (lo que lo convierte en una sola línea), pero eso empeora el código incluso aunque es más corto. No solo por ser intransitable, sino por dejarlo claro.
with
declaración en 2.5). Quizás haya una manera, quizás no la haya. Siempre puedo intentar averiguarlo, ¿verdad? Si no te gusta, vota en contra y sigue adelante. :)File.readlines("filename")
es que lee el contenido de un archivo dado su nombre. No hay ningún identificador de archivo, descriptor u objeto en ninguna parte como evidencia. Todos los "equivalentes" de Python que he visto incluyen una apertura / cierre explícito (o peor, una apertura implícita que requiere un cierre explícito).Respuestas:
Si está dispuesto a usar bibliotecas, intente instalar bifurcación-ruta (con easy_install o pip).
Entonces puedes hacer:
from path import path s = path(filename).bytes()
Esta biblioteca es bastante nueva, pero es una bifurcación de una biblioteca que ha estado flotando alrededor de Python durante años y se ha utilizado bastante. Desde que encontré esta biblioteca hace años, casi nunca uso
os.path
oopen()
más.fuente
0777
lugar de0o0777
) no es compatible con mi versión actual de Python.with open('x.py') as f: s = f.read()
*** sonríe ***
fuente
Esto es igual que el anterior pero no maneja errores:
s = open(filename, 'r').read()
fuente
Utilice pathlib .
Python 3.5 y superior:
from pathlib import Path contents = Path(file_path).read_text()
Para versiones inferiores de Python, use pathlib2 :
Entonces
from pathlib2 import Path contents = Path(file_path).read_text()
Escribir es igual de fácil:
Path(file_path).write_text('my text')
fuente
fuente
open(...)
basura se recolecta, creo. Que alguien me corrija si me equivoco.Esto no es Perl; no desea forzar el ajuste de varias líneas de código en una sola línea. Escribir una función, luego llamar a la función toma una línea de código.
def read_file(fn): """ >>> import os >>> fn = "/tmp/testfile.%i" % os.getpid() >>> open(fn, "w+").write("testing") >>> read_file(fn) 'testing' >>> os.unlink(fn) >>> read_file("/nonexistant") Traceback (most recent call last): ... IOError: [Errno 2] No such file or directory: '/nonexistant' """ with open(fn) as f: return f.read() if __name__ == "__main__": import doctest doctest.testmod()
fuente
Lento, feo, específico de la plataforma ... pero de una sola línea ;-)
import subprocess contents = subprocess.Popen('cat %s' % filename, shell = True, stdout = subprocess.PIPE).communicate()[0]
fuente
Tan simple como eso:
f=open('myfile.txt') s=f.read() f.close()
Y haz lo que quieras con el contenido "s"
fuente
Esto le da un generador, por lo que debe guardar los valores en algún lugar, o
contents = [line for line in open(filename)]
Esto hace que el ahorro en la lista de cierre explícito no sea posible (al menos con mi conocimiento de Python).
fuente
with
hace). No puede, porque una vez finalizada la iteración, sigue siendo válido buscar el archivo y comenzar a leer de nuevo, lo que no funcionaría si la iteración cerrara el archivo.