with uva print open example caracter python file iteration eof

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



python print to file (6)

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 ( 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 eliminar fácilmente usando:

line = line.rstrip()

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?


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.

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

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

donde el chunk contendrá hasta 1024 bytes a la vez desde el archivo.


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 usar el siguiente fragmento de código. readlines () lee todo el archivo a la vez y lo divide por línea.

line = obj.readlines()


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)

Debe usar while True / break construct ya que no hay ninguna prueba eof 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 expresiones en Python.

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


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 el raw_input() (Windows, Ctrl-Z Linux)