2011-06-08 20 views
6

¿Es posible cambiar el carácter de nueva línea que el método .readline() busca al leer las líneas? Es posible que tenga la necesidad de leer un flujo de un objeto de archivo que se delimitará en algo que no sean líneas nuevas, y podría ser útil obtener un fragmento a la vez. file objetos no tienen un readuntil que yo no tendría que crear si puedo usar readlineCambiar el carácter de nueva línea .readline() busca

EDIT:


todavía no he probado en un tubo que no sea stdin; pero esto parece funcionar

class cfile(file): 
    def __init__(self, *args): 
     file.__init__(self, *args) 

    def readuntil(self, char): 
     buf = bytearray() 
     while True: 
      rchar = self.read(1) 
      buf += rchar 
      if rchar == char: 
       return str(buf) 

uso:

>>> import test 
>>> tfile = test.cfile('/proc/self/fd/0', 'r') 
>>> tfile.readuntil('0') 
this line has no char zero 
this one doesn't either, 
this one does though, 0 
"this line has no char zero\nthis one doesn't either,\nthis one does though, 0" 
>>> 

Respuesta

6

considerar la creación de un generador utilizando file.read() y cediendo trozos delimitadas por el carácter dado.

Editar:

La muestra que ya ha proporcionado debería funcionar bien. Yo preferiría usar un generador:

def chunks(file, delim='\n'): 
    buf = bytearray(), 
    while True: 
     c = self.read(1) 
     if c == '': return 
     buf += c 
     if c == delim: 
      yield str(buf) 
      buf = bytearray() 
+0

He editado con una muestra de código de lo que estaba pensando; subclassing el objeto 'file'. – tMC

+0

Como está escrito actualmente, esto no 'producirá 'ningún carácter final si el archivo no termina con el caracter' delim'. Tal vez sería mejor usar 'si c == '': return str (buf)'. – martineau

Cuestiones relacionadas