Seite 1 von 2
String aus Textdatei lesen und anschliessend manipulieren
Verfasst: Dienstag 29. November 2011, 15:39
von nerdizzle
Hallo Community!
Ich habe keine grosse Ahnung von Python, doch ich möchte das noch nachholen. Normalerweise programmiere ich C/Java.
Ich habe eine physikalische Anwendung geschrieben in Java, die mir Messdaten in ein File schreibt. Sie sind so formatiert in
Measurement.txt (Drei Datenreihen mit einem Leerschlag getrennt):
0.11 1.22 3.22
0.01 2.22 1.55
0.52 0.20 2.20
etc.
Diese Daten möchte ich herauslesen und anschliessend in ein Array speichern, damit ich nachher mit SciPy Plots etc. erstellen kann.
Code: Alles auswählen
import numpy
import scipy
import matplotlib
import array
density = []
flow = []
vAverage = []
fileName = "Measurement.txt"
datei = open(fileName,"r")
for zeile in datei.readlines():
#print zeile
density.append(double([b]Hier sollte der erste Werte des Dokuments stehen[/b]))
flow.append(double([b]Hier sollte der zweite Werte des Dokuments stehen[/b]))
vAverage.append(double([b]Hier sollte der dritte Werte des Dokuments stehen[/b]))
datei.close()
mit zeile.split() kann ich den String unterteilen (whitespace delimiter). Doch wie verwende ich anschliessend die drei Teile und füge sie in mein Array?
Cheers nerdizzle
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Dienstag 29. November 2011, 15:54
von Kebap
Hallo nerdizzle!
Code: Alles auswählen
>>> zeile = "0.11 1.22 3.22"
>>> liste = zeile.split()
>>> print liste
['0.11', '1.22', '3.22']
>>> print liste[0]
0.11
>>> print liste[1]
1.22
>>>
Weitere Fragen?

Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Dienstag 29. November 2011, 15:54
von /me
nerdizzle hat geschrieben:Mit zeile.split() kann ich den String unterteilen (whitespace delimiter). Doch wie verwende ich anschliessend die drei Teile und füge sie in mein Array?
readlines() brauchst du nicht und wenn du beim Öffnen mit
with arbeitest, dann kannst du auch auf das anschließende Schließen verzichten.
Code: Alles auswählen
with open(filename, 'r') as datei:
for zeile in datei:
# do something
Das von dir so genannte
Array nennt sich in Wirklichkeit
Liste. Der Code sieht übrigens so aus, als wolltest du die Daten entgegen der Beschreibung nicht in eine Liste, sondern in drei unterschiedliche Listen stecken.
Du hast bereits völlig korrekt erkannt, dass du die Zeile mit
split() in ihre einzelnen Bestandteile zerlegen kannst. Das Ergebnis ist eine Liste und dann brauchst du nur noch auf das jeweilige Listenelement zugreifen.
Code: Alles auswählen
>>> data = "0.11 1.22 3.22".split()
>>> print data[0]
0.11
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Dienstag 29. November 2011, 15:57
von Hyperion
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Dienstag 29. November 2011, 17:17
von nerdizzle
Danke für eure schnelle Hilfe, was alles sehr verständlich!
Ich werde voraussichtlich Hyperions Version implementieren,Danke.
Doch ich habe noch zwei Fragen bezüglich der Ausgangsfragestellung.
Definiert das mir eine Liste, in der ich beliebig viele Elemente einfügen kann?
und warum funktioniert dieses Vorgehen nicht?
Code: Alles auswählen
i=0
with open(fileName,"r") as datei:
for zeile in datei:
liste = zeile.split()
print liste [0] # Ist ok
print liste [1] # Ist ok
print liste [1] # Ist ok
density[i] = liste[0] #fehlerhafte Zuweisung, list assignment index out of range.
i=i+1;
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Dienstag 29. November 2011, 17:23
von /me
nerdizzle hat geschrieben:Definiert das mir eine Liste, in der ich beliebig viele Elemente einfügen kann?
Beliebig viele bis der Speicher ausgeht, ja.
nerdizzle hat geschrieben:Code: Alles auswählen
i=0
with open(fileName,"r") as datei:
for zeile in datei:
liste = zeile.split()
print liste [0] # Ist ok
density[i] = liste[0] #fehlerhafte Zuweisung, list assignment index out of range.
i=i+1;
Bitte verwende im Forum die expliziten Python-Code-Tags, dann kann man den Code besser lesen. (Und gewöhne dir bei Python das Semikolon am Zeilenende ab.)
Die Zuweisung wird wohl deshalb nicht funktionieren, weil density
nicht existiert. Einen Wert an einer bestimmten Stelle kann man natürlich nur dann durch einen anderen Wert überschreiben, wenn an der entsprechenden Listenposition überhaupt ein Wert existiert.
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Dienstag 29. November 2011, 17:25
von EyDu
Hallo.
Du kannst einem noch nicht existierendem Eintrag in der Liste nicht einfach etwas zuweisen. Das sagt die Fehlermedlung eigentlich recht deutlich. Benutze in diesem Fall einfach die append-Methode von Listen:
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Dienstag 29. November 2011, 17:48
von norbert
Hi,
wenn Du die Daten sowieso mit numpy weiter verabeiten willst, kannst Du sie eigentlich auch gleich mit numpy einlesen:
Code: Alles auswählen
with open("daten.txt","r") as datei:
DatenArray = numpy.loadtxt(datei, delimiter=" ")
Edit: Sorry Hyperion, deinen Link habe ich überlesen

Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Dienstag 29. November 2011, 18:22
von problembär
nerdizzle hat geschrieben:Diese Daten möchte ich herauslesen und anschliessend in ein Array speichern
Im Grunde macht ".readlines()" genau das.
Auch das Öffnen mit "with" ist zwar ok, aber das Öffnen ohne "with" auch:
Code: Alles auswählen
fileName = "Measurement.txt"
datei = open(fileName, "r")
mylist = datei.readlines()
datei.close()
for i in mylist:
print i
Dann hast Du den Dateiinhalt also in "mylist".
Wie gesagt, die anderen Vorschläge sind auch ok, sie sind etwas moderner. Das bedeutet aber nicht, daß die alten Methoden unzulässig wären.
Man kann beides benutzen. Laß' Dir hier nichts anderes einreden.
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Dienstag 29. November 2011, 18:50
von Hyperion
problembär hat geschrieben:
Wie gesagt, die anderen Vorschläge sind auch ok, sie sind etwas moderner. Das bedeutet aber nicht, daß die alten Methoden unzulässig wären.
Man kann beides benutzen. Laß' Dir hier nichts anderes einreden.
Die anderen sind idiomatischer und teilweise einfach komfortabler (numpy-Funktionalität nutzen!). Und alten Code schreiben macht es eben nicht besser und es ist mit einer aktuellen Python-Version eben nicht empfehlenswert.
Im übrigen ist Deine Version ohne `with` auch nach "alten" Python-Idiomen unpythonisch. Im Fehlerfalle wird die Datei nämlich nicht ordentlich geschlossen - das nur mal am Rande!
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Dienstag 29. November 2011, 20:21
von BlackJack
@problembär: `readlines()` liefert eine Liste und kein Array. nerdizzle will am Ende ja tatsächlich mit Numpy-Arrays arbeiten.
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Dienstag 29. November 2011, 23:25
von problembär
Hyperion hat geschrieben:Die anderen sind idiomatischer und teilweise einfach komfortabler (numpy-Funktionalität nutzen!).
Es kann wohl nicht schaden, wenn er erstmal (mit oder ohne "with") lernt, wie man generell aus einer Datei liest. Vielleicht will er das ja auch mal ohne numpy machen.
Hyperion hat geschrieben:Und alten Code schreiben macht es eben nicht besser und es ist mit einer aktuellen Python-Version eben nicht empfehlenswert.
Hat aber immerhin den Vorteil, daß solcher Code dann mit vielen Python-Versionen läuft. Ich nutze z.B. 2.4, und da gibt's das "with" noch gar nicht.
Hyperion hat geschrieben:Im übrigen ist Deine Version ohne `with` auch nach "alten" Python-Idiomen unpythonisch. Im Fehlerfalle wird die Datei nämlich nicht ordentlich geschlossen - das nur mal am Rande!
Hmm, hatte da noch nie Probleme. Wie sollte man das denn ausschließen?
BlackJack hat geschrieben:@problembär: `readlines()` liefert eine Liste und kein Array. nerdizzle will am Ende ja tatsächlich mit Numpy-Arrays arbeiten.
Ah, ok. Aber ich denke schon, daß es eine Möglichkeit geben wird, Python-Listen in Numpy-Arrays umzuwandeln.
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Dienstag 29. November 2011, 23:38
von EyDu
problembär hat geschrieben:Es kann wohl nicht schaden, wenn er erstmal (mit oder ohne "with") lernt, wie man generell aus einer Datei liest. Vielleicht will er das ja auch mal ohne numpy machen.
Wie man am ersten Beitrag sieht, kann er das bereits.
problembär hat geschrieben:Hat aber immerhin den Vorteil, daß solcher Code dann mit vielen Python-Versionen läuft. Ich nutze z.B. 2.4, und da gibt's das "with" noch gar nicht.

Die meisten werden sicher eine neuere Version nutzen. Hinzu kommt, dass es meistens überhaupt nicht notwendig ist eine ältere Version zu unterstützen. Das endet meistens nur in unnötiger Arbeit die keinen Vorteil bringt und gleichzeitig Fehler einbaut.
problembär hat geschrieben:Hmm, hatte da noch nie Probleme. Wie sollte man das denn ausschließen?
Du fängst zum Beispiel keine Exceptions ab, die beim Lesen der Daten auftreten können. Das bedeutet, dass die Datei in einem Fehlerfall nicht richtig geschlossen wird. In älteren Versionen muss das Lesen und Schreiben von einem try/except-Block umschlossen sein.
problembär hat geschrieben:Ah, ok. Aber ich denke schon, daß es eine Möglichkeit geben wird, Python-Listen in Numpy-Arrays umzuwandeln.
Und warum sollte man diesen überflüssigen Umweg gehen? Er kostet Zeit, man baut sich Fehler ein, kann sein Programm schlechter erweitern und langsamer ist es auch noch. Vielleicht findest du ja Vorteile?
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Mittwoch 30. November 2011, 11:33
von problembär
EyDu hat geschrieben:problembär hat geschrieben:Ah, ok. Aber ich denke schon, daß es eine Möglichkeit geben wird, Python-Listen in Numpy-Arrays umzuwandeln.
Und warum sollte man diesen überflüssigen Umweg gehen? Er kostet Zeit, man baut sich Fehler ein, kann sein Programm schlechter erweitern und langsamer ist es auch noch. Vielleicht findest du ja Vorteile?
Wenn es einen direkten Weg gibt, dann ist der sicher besser. Gibt es ja offenbar. Wahrscheinlich würde eine Umwandlung in Bezug auf die Geschwindigkeit allerdings vernachlässigbar sein. Kommt natürlich auf die Datenmenge an.
EyDu hat geschrieben:problembär hat geschrieben:Hat aber immerhin den Vorteil, daß solcher Code dann mit vielen Python-Versionen läuft. Ich nutze z.B. 2.4, und da gibt's das "with" noch gar nicht.

Die meisten werden sicher eine neuere Version nutzen. Hinzu kommt, dass es meistens überhaupt nicht notwendig ist eine ältere Version zu unterstützen. Das endet meistens nur in unnötiger Arbeit die keinen Vorteil bringt und gleichzeitig Fehler einbaut.
Es ist schon ein Problem, wenn man Programme stets in der allerneuesten Syntax schreibt.
Mit 2.4 kann ich nur noch die wenigsten Anwendungen nutzen. Hab' neulich z.B. probiert, [url=p://mypaint.intilinux.com]MyPaint[/url] zu installieren. Geht nicht. Wie fast alles.
Man erreicht also nur sehr wenige Leute, wenn man die neueste Syntax nutzt. Nicht jeder, der eine Python-Anwendung startet, hält sein Python-System stets auf dem neuesten Stand. Das wird bei der Vielzahl der Module wohl nur eine ganz geringe Minderheit tun. Der Konflikt zwischen 2.x und 3.x kommt noch dazu.
Und nicht jeder kann sich alle 2 Jahre einen neuen Rechner leisten. Vor allem, wenn der alte gar nicht kaputt ist.
Wenn man also benutzerfreundlich schreiben will, das heißt, wenn der Benutzer das Skript ohne große Probleme sofort starten können soll, sollte man also altbewährten Standardcode wählen und auch so wenige externe Module wie möglich einbinden.
EyDu hat geschrieben:problembär hat geschrieben:Hmm, hatte da noch nie Probleme. Wie sollte man das denn ausschließen?
Du fängst zum Beispiel keine Exceptions ab, die beim Lesen der Daten auftreten können. Das bedeutet, dass die Datei in einem Fehlerfall nicht richtig geschlossen wird. In älteren Versionen muss das Lesen und Schreiben von einem try/except-Block umschlossen sein.
Hmm, wenn es beim Lesen einen Fehler gibt, will ich doch, daß das Programm abbricht und eine Fehlermeldung ausgibt. Das macht es doch gerade, wenn ich den Fehler
nicht abfange.
Beim Abbruch des Python-Skripts stürzt ja nicht der Interpreter mit ab. Sondern er wird dann sicherlich noch offene Filehandles wieder schließen, bevor er sich beendet.
Daher ist try/except hier etwas übervorsichtig (und also nicht nötig). Gibt's in anderen Sprachen, die das gleiche machen, so ja auch gar nicht.
EyDu hat geschrieben:problembär hat geschrieben:Es kann wohl nicht schaden, wenn er erstmal (mit oder ohne "with") lernt, wie man generell aus einer Datei liest. Vielleicht will er das ja auch mal ohne numpy machen.
Wie man am ersten Beitrag sieht, kann er das bereits.
Prima, dann hätte man ihm also sagen sollen, er sei auf einem guten Weg. Die übrige Diskussion war dann also auch mal wieder überflüssig.
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Mittwoch 30. November 2011, 18:02
von Hyperion
problembär hat geschrieben:
Hmm, wenn es beim Lesen einen Fehler gibt, will ich doch, daß das Programm abbricht und eine Fehlermeldung ausgibt. Das macht es doch gerade, wenn ich den Fehler nicht abfange.
Manchmal will man das, manchmal nicht - oder fändest Du es prickelnd, wenn ein GUI-Programm abstürzt, weil Du eine ungültige Datei in einem Dialog ausgewählt hast?
problembär hat geschrieben:
Beim Abbruch des Python-Skripts stürzt ja nicht der Interpreter mit ab. Sondern er wird dann sicherlich noch offene Filehandles wieder schließen, bevor er sich beendet.
Nee, er beendet sich. Und wieso sollte er das tun? Dazu müsste er ja wissen, ob dieses Verhalten erwünscht ist! (Stichwort "Transkationen"...)
problembär hat geschrieben:
Daher ist try/except hier etwas übervorsichtig (und also nicht nötig). Gibt's in anderen Sprachen, die das gleiche machen, so ja auch gar nicht.
Wenn Dir Deine Daten egal sind, ja. Ich nutze aber auch einen Fahrradhelm und bevorzuge Autos mit Airbag - auch wenn ich diese Utensilien nicht wirklich in Funktion erleben will.
Da Du es vielleicht nie gesehen hast, hier mal eine `with` äquivalente Lösung:
Code: Alles auswählen
try:
foo = open()
# irgend etwas mit foo machen
except IOError:
# irgend ne Ausgabe, ggf. einfach die Excpetion direkt durchschleifen
finally:
# wird immer aufgerufen
foo.close()
Und nun sage noch mal, dass die Lösung mit `with` aufwendiger ist! Die Lösung mit `with` ist wie der Airbag im Auto; man hat ihn eh eingebaut und muss ihn nicht noch anlegen, wie den "Fahrradhelm" (try...except...finally) bei Deiner (alten) Lösung.
Lies Dir dazu mal Abschnitt 8.6 und 8.7 im Tutorial durch.
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Mittwoch 30. November 2011, 18:14
von deets
problembär hat geschrieben:einbaut.
Es ist schon ein Problem, wenn man Programme stets in der allerneuesten Syntax schreibt.
Mit 2.4 kann ich nur noch die wenigsten Anwendungen nutzen. Hab' neulich z.B. probiert, [url=p://mypaint.intilinux.com]MyPaint[/url] zu installieren. Geht nicht. Wie fast alles.
Man erreicht also nur sehr wenige Leute, wenn man die neueste Syntax nutzt. Nicht jeder, der eine Python-Anwendung startet, hält sein Python-System stets auf dem neuesten Stand. Das wird bei der Vielzahl der Module wohl nur eine ganz geringe Minderheit tun.[/quote]
Abgesehen davon, dass du fuer deine Behauptungen keine Belege bringst - Python 2.5 (und damit die Verwendbarkeit von with) ist seit September 2006 released. Da zieht dann auch nicht das "alle 2-3 Jahre nen neuen Rechner kaufen"-Argument. Welches eh Bloedsinn ist, denn bis dato sind eigentlich alle Python-Versionen selbst schneller geworden als der Vorgaenger - d.h. je aelter der Rechner, desto sinnvoller zu upgraden.
Also, was du dir wirklich sparen kannst ist dein sinnloser Versuch, deine mangelnde Kenntnis in Python und den Unwillen, daran etwas zu aendern, als sinnvolle, gut begruendete Haltung zu verkaufen.
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Mittwoch 30. November 2011, 21:53
von EyDu
problembär hat geschrieben:EyDu hat geschrieben:problembär hat geschrieben:Hmm, hatte da noch nie Probleme. Wie sollte man das denn ausschließen?
Du fängst zum Beispiel keine Exceptions ab, die beim Lesen der Daten auftreten können. Das bedeutet, dass die Datei in einem Fehlerfall nicht richtig geschlossen wird. In älteren Versionen muss das Lesen und Schreiben von einem try/except-Block umschlossen sein.
Hmm, wenn es beim Lesen einen Fehler gibt, will ich doch, daß das Programm abbricht und eine Fehlermeldung ausgibt. Das macht es doch gerade, wenn ich den Fehler
nicht abfange.
Natürlich werden dabei nicht die Fehler verschluckt sonder dafür gesorgt, dass die Datei ordnungsgemäß geschlossen wird. Das ich mich hier etwas undeutlich ausgedrückt habe ist unglücklich, deine Anmerkung macht aber deutlich, dass du das with-Statement überhaupt nicht richtig verstanden hast.
problembär hat geschrieben:Beim Abbruch des Python-Skripts stürzt ja nicht der Interpreter mit ab. Sondern er wird dann sicherlich noch offene Filehandles wieder schließen, bevor er sich beendet.
Dann kannst mir auch bestimmt die Stelle in der Dokumentation nennen, wo das Schließen von noch offenen Handles bei der Terminierung des Programms garantiert wird.
@Hyperion: Bei deiner "äquivalenten" Lösung ist ein wenig schief gegangen:
PEP 343.
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Mittwoch 30. November 2011, 22:16
von Hyperion
EyDu hat geschrieben:
@Hyperion: Bei deiner "äquivalenten" Lösung ist ein wenig schief gegangen:
PEP 343.
Spielst Du auf das `except` an? Das kann man natürlich weglassen, wenn man ihn nicht behandeln will.
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Mittwoch 30. November 2011, 23:16
von jerch
@problembär:
Wenn die Exception zum Prozessabbruch führt, kümmert sich unter Windows und Linux der Kernel selbst ums Aufräumen "vergessener" Filehandles. Allerdings sollte dieser Rettungsanker nicht dazu führen, unsauber zu programmieren. In puncto Python gibts eben nicht nur CPython mit seinem Interpreter und wie andere hier reagieren (Jython in der JVM etc.) ist fraglich. Prinzipell sollte man immer um die ordnungsgemässe Degradierung angefragter Ressourcen im eigenen Code bemüht sein. Im Falle eines Dateihandles ohne with dann eben mit Exceptionhandling.
Re: String aus Textdatei lesen und anschliessend manipuliere
Verfasst: Donnerstag 1. Dezember 2011, 10:32
von EyDu
Hyperion hat geschrieben:EyDu hat geschrieben:
@Hyperion: Bei deiner "äquivalenten" Lösung ist ein wenig schief gegangen:
PEP 343.
Spielst Du auf das `except` an? Das kann man natürlich weglassen, wenn man ihn nicht behandeln will.
Nein, darauf, dass das open nicht in den try-Block gehört.