file.read() nur bis zu einem bestimmten Zeichen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
chaos
User
Beiträge: 52
Registriert: Samstag 21. August 2004, 11:19

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
Slackware will never die.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
chaos
User
Beiträge: 52
Registriert: Samstag 21. August 2004, 11:19

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.
Slackware will never die.
BlackJack

Na, in dem Du es mit popen4() eben mit 'rU' als `mode` öffnest.
chaos
User
Beiträge: 52
Registriert: Samstag 21. August 2004, 11:19

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'
>>> 
Slackware will never die.
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. :?
chaos
User
Beiträge: 52
Registriert: Samstag 21. August 2004, 11:19

Kein Problem ;)
Slackware will never die.
Antworten