¿Cuál es la contraparte perfecta en Python para “mientras no sea EOF”?

Para leer un 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 de forma simple y rápida en Python.

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. Usar el objeto de archivo como un iterable usa un búfer para asegurar lecturas de alto rendimiento.

Puedes hacer lo mismo con la entrada estándar (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), b''): do_something() 

donde el chunk contendrá hasta 1024 bytes a la vez desde el archivo y la iteración se detendrá cuando openfileobject.read(1024) comience a devolver cadenas de bytes vacías.

Puedes imitar el lenguaje C en Python.

Para leer un búfer hasta el número max_size 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 construcción while True / break ya que no hay ninguna prueba eof en Python que no sea la falta de bytes devueltos desde una lectura.

En C, podría tener:

 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 expresiones en Python.

Es ciertamente 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) 

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 construcción se encarga de eso).

Finalmente, vale la pena señalar que la line conservará la nueva línea final. Esto se puede quitar fácilmente usando:

 line = line.rstrip() 

Si bien hay sugerencias anteriores para “hacerlo de forma 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 "", line 1, in  EOFError: EOF when reading a line 

O presione Ctrl-Z en un raw_input() (Windows, Ctrl-Z Linux)

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

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