Recorra el archivo para leer las líneas:
with open('somefile') as openfileobject:
for line in openfileobject:
do_something()
Los objetos de archivo son iterables y producen líneas hasta EOF. El uso del objeto de archivo como iterable utiliza un búfer para garantizar lecturas eficaces.
Puede hacer lo mismo con el stdin (no es necesario usar raw_input()
:
import sys
for line in sys.stdin:
do_something()
Para completar la imagen, las lecturas binarias se pueden realizar con:
from functools import partial
with open('somefile', 'rb') as openfileobject:
for chunk in iter(partial(openfileobject.read, 1024), b''):
do_something()
where chunk
contendrá hasta 1024 bytes a la vez del archivo, y la iteración se detiene cuando openfileobject.read(1024)
comienza a devolver cadenas de bytes vacías.
line
tendrá un carácter de nueva línea al final.stdin
proceso en ejecución ... por lo que nunca tendrá EOF hasta que mate el proceso. Pero luego llego al "final hasta ahora" y me estanco. ¿Cómo detecto esto y no un punto muerto? Como si no hubiera nuevas líneas, deja de leer los archivos (incluso si no hay un EOF, que en mi caso nunca existirá).Puede imitar el lenguaje C en Python.
Para leer un búfer hasta un
max_size
número de bytes, puede hacer esto:O bien, un archivo de texto línea por línea:
Debe usar la
while True / break
construcción, ya que no hay ninguna prueba eof en Python que no sea la falta de bytes devueltos por una lectura.En C, es posible que tenga:
Sin embargo, no puede tener esto en Python:
porque las asignaciones no están permitidas en expresiones en Python (aunque las versiones recientes de Python pueden imitar esto usando expresiones de asignación, ver más abajo).
Sin duda, es más idiomático en Python hacer esto:
Actualización: desde Python 3.8 también puede usar expresiones de asignación :
fuente
readline()
: puede hacer un manejo de errores de grano fino, como capturarUnicodeDecodeError
, lo que no puede hacer con lafor
iteración idiomática .El lenguaje de Python para abrir un archivo y leerlo línea por línea es:
El archivo se cerrará automáticamente al final del código anterior (la
with
construcción se encarga de eso).Finalmente, vale la pena señalar que
line
preservará la nueva línea final. Esto se puede eliminar fácilmente usando:fuente
for line in f.readlines(): ...
, una solución comúnmente sugerida.Puede usar el siguiente fragmento de código para leer línea por línea, hasta el final del archivo
fuente
Si bien hay sugerencias anteriores para "hacerlo a la manera de Python", si uno realmente quiere tener una lógica basada en EOF, supongo que usar el manejo de excepciones es la forma de hacerlo:
Ejemplo:
O presione Ctrl-Zcuando se le
raw_input()
solicite (Windows, Ctrl-ZLinux)fuente
Puede utilizar el siguiente fragmento de código. readlines () lee todo el archivo a la vez y lo divide por línea.
fuente
Además de la gran respuesta de @ dawg, la solución equivalente usando el operador de morsa (Python> = 3.8):
fuente