Pregunta Cuál es la contraparte perfecta en Python para "mientras no EOF"


Para leer algún archivo de texto, en C o Pascal, siempre uso los siguientes fragmentos para leer los datos hasta EOF:

while not eof do begin
  readline(a);
  do_something;
end;

Por lo tanto, me pregunto cómo puedo hacer esto simple y rápido en Python?


74
2018-03-24 14:25


origen


Respuestas:


Pasa el cursor sobre el archivo para leer líneas:

with open('somefile') as openfileobject:
    for line in openfileobject:
        do_something()

Los objetos de archivo son iterables y ceden líneas hasta EOF. Al usar el objeto de archivo como un iterable, se usa un buffer para asegurar lecturas de rendimiento.

Puedes 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 hacer con:

from functools import partial

with open('somefile', 'rb') as openfileobject:
    for chunk in iter(partial(openfileobject.read, 1024), ''):
        do_something()

dónde chunk contendrá hasta 1024 bytes a la vez desde el archivo.


137
2018-03-24 14:26



Puedes imitar el modismo C en Python.

Para leer un búfer hasta 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)

Tienes que usar while True / break construir ya que hay no hay prueba en Python aparte de 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 puedes tener esto en Python:

 while(line=f.readline()):
     # syntax error

porque las asignaciones no están permitidas en las expresiones en Python.

Es seguramente Más idiomático en Python para hacer esto:

# THIS IS IDIOMATIC Python. Do this:
with open('somefile') as f:
    for line in f:
        process(line)

44
2018-03-24 14:40



El modismo 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 (el with constructo 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()

14
2018-03-24 14:27



Si bien hay sugerencias anteriores para "hacerlo de la manera python", si uno realmente quiere tener una lógica basada en EOF, entonces supongo que usar el manejo de excepciones es la manera 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-Z en un raw_input() prompt (Windows, Ctrl-Z Linux)


8
2017-10-21 19:03



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()

4
2017-10-27 11:53



Puede usar el siguiente fragmento de código. readlines () lee todo el archivo a la vez y lo divide por línea.

line = obj.readlines()

1
2018-03-08 16:33