for line in fd ... IFS=\0

31/03/2008 - 09:37 von Thomas Guettler | Report spam
Hallo,

Kann man das Trennzeichen für (x)readline irgendwie angeben?

Ich würde gerne an \0 trennen. Beispiel:

find -name '...' -print0 | myscript.py

Mit folgender Funktion làsst sich das nachbilden, aber ich kann
mir vorstellen, dass es bei großen Datenmengen langsam wird, weil
für jedes Zeichen Python Code ausgeführt wird.

{{{
def ifs_readline(fd, splitchar):
buf=[]
while True:
char=fd.read(1)
if not char:
break
if char==splitchar:
yield ''.join(buf)
buf=[]
else:
buf.append(char)

import sys
for line in ifs_readline(sys.stdin, '\0'):
print line
}}}

Der Unterschied zum normalen readline() ist, dass
das Trennzeichen nicht ausgegeben wird.

Wie wahrscheinlich ist es, dass eine Implementierung
im Python Core (C) integriert wird? Oder gibt es
schon eine Lösung ohne eine Schleife über alle
Zeichen im Eingangsstrom?

Thomas


Thomas Guettler, http://www.thomas-guettler.de/
E-Mail: guettli (*) thomas-guettler + de
 

Lesen sie die antworten

#1 Marc BlackJack Rintsch
31/03/2008 - 11:16 | Warnen spam
On Mon, 31 Mar 2008 09:37:34 +0200, Thomas Guettler wrote:

Oder gibt es schon eine Lösung ohne eine Schleife über alle
Zeichen im Eingangsstrom?



Du könntest blockweise einlesen und an dem Trennzeichen splitten. Wenn
mehr als ein Element dabei heraus kommt, kannst Du bis auf das letzte alle
`yield`\en. Das letzte muss man dann besonders behandeln, weil es der
Anfang einer neuen "Zeile" sein kann, deren Ende erst in einem der
folgenden Blöcke steckt.

Ciao,
Marc 'BlackJack' Rintsch

Ähnliche fragen