Saltar al contenido

file – ¿Cuál es la contraparte perfecta en Python para «mientras no EOF»

octubre 23, 2021
apple touch icon@2

Puedes imitar el idioma de 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, 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)

Necesitas usar while True / break construir ya que hay sin 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 no se permiten asignaciones en expresiones en Python (aunque las versiones recientes de Python pueden imitar esto usando expresiones de asignación, ver más abajo).

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)

Actualizar: Desde Python 3.8 también puede usar expresiones de asignación:

 while line := f.readline():
     process(line)
close