Seite 1 von 1

file.read() nur bis zu einem bestimmten Zeichen

Verfasst: Sonntag 13. März 2005, 12:24
von chaos
Hallo

Ich hab hier einen stream (bzw. durch popen4 ein dazu passendes Fileobjekt), in dem die Zeilen dummerweise nicht durch \n sondern durch \r getrennt sind (bei der Normalen Ausgabe des Programmes auch sinnvoll, dann wird der Fortschrittsbalken vom Zeilenanfang an neu geschrieben).
Ich will jetzt die Zeilen aber stückweise zur Entstehungszeit einlesen/ausgeben, daher ist ein file.read() unpassend, da das erst terminiert, wenn der Prozess zuende ist.
Man kann jetzt freilich ein file.read(1) machen und jedesmal testen, ob der Rückgabewert "\r" ist, aber gibt es nicht etwas wie file.readline(), daß beim Auftreten eines übergebenen Zeichens abbricht, oder muß ich das selberbasteln?

ciao
chaos

PS python2.4 freeBSD-5.3

Verfasst: Sonntag 13. März 2005, 12:40
von mawe
Hi!

Wenn ich die Doku richtig verstehe, sollte es gehen wenn Du mit "rU" öffnest.
pydoc hat geschrieben: Add a 'U' to mode to open the file for input with universal newline
support. Any line ending in the input file will be seen as a '\n'
in Python. Also, a file so opened gains the attribute 'newlines';
the value for this attribute is one of None (no newline read yet),
'\r', '\n', '\r\n' or a tuple containing all the newline types seen.
Gruß, mawe

Verfasst: Sonntag 13. März 2005, 12:53
von chaos
Und wie mach ich das mit einem Object, daß ich von popen4 zurückbekomm, denn das ist ja schon offen?
Achso file.newlines darf ich anscheinend nicht überschreiben.

Verfasst: Montag 14. März 2005, 00:09
von BlackJack
Na, in dem Du es mit popen4() eben mit 'rU' als `mode` öffnest.

Verfasst: Montag 14. März 2005, 10:22
von chaos
scheint zumindestens hier nicht zu gehen:

Code: Alles auswählen

 thomas@chaos /tmp % echo "foo\rbar\rfoobar\nend" >foo
 thomas@chaos /tmp % cat foo 
foobar
end
 thomas@chaos /tmp % # die Datei funktioniert also so, wie sie soll.
 thomas@chaos /tmp %python
Python 2.4 (#2, Feb  4 2005, 19:06:10) 
[GCC 3.4.2 [FreeBSD] 20040728] on freebsd5
Type "help", "copyright", "credits" or "license" for more information.
>>> from os import popen4
>>> a=popen4('cat foo','rU')
>>> a[1].readline()
'foo\rbar\rfoobar\n'
>>> a[1].readline()
'end\n'
>>> 

Verfasst: Montag 14. März 2005, 23:16
von BlackJack
Mist, ich hatte mir nur die Signatur von popen4 angeschaut. Da gibt es ein `mode`, das als Default den Wert 't' besitzt. Der Parameter wird aber gar nicht benutzt. Das sieht man aber erst, wenn man in den Quelltext schaut. Sorry. :?

Verfasst: Dienstag 15. März 2005, 10:48
von chaos
Kein Problem ;)