Respuestas:
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.
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:
with open(filename, 'rb') as f:
while True:
buf = f.read(max_size)
if not buf:
break
process(buf)
O bien, un archivo de texto línea por línea:
# warning -- not idiomatic Python! See below...
with open(filename, 'rb') as f:
while True:
line = f.readline()
if not line:
break
process(line)
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:
while ((ch != '\n') && (ch != EOF)) {
// read the next ch and add to a buffer
// ..
}
Sin embargo, no puede tener esto en Python:
while (line = f.readline()):
# syntax error
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:
# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
for line in f:
process(line)
Actualización: desde Python 3.8 también puede usar expresiones de asignación :
while line := f.readline():
process(line)
readline()
: puede hacer un manejo de errores de grano fino, como capturar UnicodeDecodeError
, lo que no puede hacer con la for
iteración idiomática .
El lenguaje de Python para abrir un archivo y leerlo línea por línea es:
with open('filename') as f:
for line in f:
do_something(line)
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:
line = line.rstrip()
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
line = obj.readline()
while(line != ''):
# Do Something
line = obj.readline()
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:
try:
line = raw_input()
... whatever needs to be done incase of no EOF ...
except EOFError:
... whatever needs to be done incase of EOF ...
Ejemplo:
$ echo test | python -c "while True: print raw_input()"
test
Traceback (most recent call last):
File "<string>", line 1, in <module>
EOFError: EOF when reading a line
O presione Ctrl-Zcuando se le raw_input()
solicite (Windows, Ctrl-ZLinux)
Puede utilizar el siguiente fragmento de código. readlines () lee todo el archivo a la vez y lo divide por línea.
line = obj.readlines()
line
tendrá un carácter de nueva línea al final.