Seite 1 von 1

Auslesen von Variablen aus Textdatei

Verfasst: Donnerstag 26. Februar 2009, 13:47
von Elchsfell
Hallo zusammen,

dies ist mein erster Post in diesem Forum, von daher fange ich erstmal mit einem freundlichen "Hallo" an...

Nun zu meinem Problem:
Eigentlich ist es etwas recht triviales, allerdings habe ich im Netz noch nichts brauchbares gefunden (ich suche also parallel noch).

ich habe eine .txt-Datei mit diversen Variablen mit Hilfe eines Python Skripts erstellt, was relativ einfach war, da die Variablen lediglich nebeneinander und untereinander geschrieben werden müssen.
Die Datei schaut ungefähr so aus:
Position: x.x1x y.yyy z.zzz Vektor: vxxx, vyyy, vzzz Age: xyz
Position: x.xx2 y.yyy z.zzz Vektor: vxxx, vyyy, vzzz Age xyz
Position: x.x3x y.yyy z.zzz Vektor: vxxx, vyyy, vzzz Age xyz
Position: x.xxx y.yyy z.zzz Vektor: vxxx, vyyy, vzzz Age xyz
Position: x.xxx y.yyy z.zzz Vektor: vxxx, vyyy, vzzz Age xyz

Getrennt werden die Positionen jeweils von einem Leerzeichen, allerdings sind die Variablen nicht immer gleich lang (double) und mal gibt es zwei Stellen hinter dem Komma, mal drei usw.
Wie kann ich nun über ein Python Skript in einer beliebigen Zeile eine beliebige Variable rauslesen und weiterverwenden???

Ich hoffe, Ihr könnt mir weiterhelfen, vielen Dank!
Elchsfell.

Verfasst: Donnerstag 26. Februar 2009, 13:49
von derdon
Du suchst das csv-Modul

Verfasst: Donnerstag 26. Februar 2009, 15:22
von Elchsfell
Danke. Aber ich habe keine Daten, welche von Excel generiert wurden.
Ich werde es aber trotzdem mal mit dem CSV-Modul probieren.

Weitere Möglichkeiten?

Verfasst: Donnerstag 26. Februar 2009, 15:31
von derdon
In dem Fall gibt es zwar Alternativen, aber keine empfehlenswerten / nennenswerten. Excel brauchst du übrigens nicht :wink:

Verfasst: Donnerstag 26. Februar 2009, 17:11
von Hyperion
Also blicke ich das richtig:

1.) Python-Script schreibt Daten in eine Datei
2.) (anderes) Python-Script soll diese auslesen und weiterverarbeiten?

Also dafür würde sich doch pickle anbieten! Alternativ etwas, das bereits das Marshalling und Demarshalling von Variablen beherrscht, aber human readable ist wie JSON (wobei ich grad sehe, dass da double Werte nicht dazugehören ...)

Verfasst: Donnerstag 26. Februar 2009, 17:36
von Elchsfell
Position: -0.3992 -2.79143e-19 -2.82073e-13 Vector: 0.00011165 -1.16403e-12 -1.17624e-06 Age: 2.39809e-07
Position: -0.3992 -4.46599e-18 -4.51293e-12 Vector: 0.00055821 -5.8197e-12 -5.88088e-06 Age: 9.59235e-07

So sehen meine Zeilen in der gesamten Datei aus.
Dabei handelt es sich um geometrische Positionen (x, y, z) und deren Richtungsvektoren. Diese Datei schreibt mir eine andere Auswertesoftware exakt so wie es oben steht in eine txt-Datei.
Nun will ich die Positionen und die Vektoren auslesen, beispielsweise so:
PosX1 = -0.3992
PosY1 = -2.79143e-19
usw.
Ich brauch also einen Befehl, mit welchem ich explizit einen Eintrag in einer Zeile mit der entsprechenden Spalte ansprechen kann.
Mit diesen Positionen muss ich dann weiterarbeiten.

Verfasst: Donnerstag 26. Februar 2009, 18:58
von Hyperion
Elchsfell hat geschrieben: Diese Datei schreibt mir eine andere Auswertesoftware exakt so wie es oben steht in eine txt-Datei.
So, und um auf meine Frage zu antworten: Um was für eine Auswertesoftware handelt sich sich da? Aus Deinem ersten Post zu urteilen, ist das ebenfalls ein Pythonscript. Kannst Du das bitte näher ausfüren.

Verfasst: Freitag 27. Februar 2009, 03:27
von gkuhl
Guten Morgen,
ich wuerde ja eher das folgende Ausgabeformat bevorzugen, da es sich deutlich einfacher einlesen laesst.

Code: Alles auswählen

id x y z u v w age
1 -0.3992 -2.79143e-19 -2.82073e-13 0.00011165 -1.16403e-12 -1.17624e-06 2.39809e-07
2 -0.3992 -4.46599e-18 -4.51293e-12 0.00055821 -5.8197e-12 -5.88088e-06 9.59235e-07 
Wenn du bestimme Datensaetzen suchen und auslesen moechtest bietet sich wohl auch eine SQL Datenbank (z.b. SQLite) an.

Ich schliesse mich da Hyperion, dass es vielleicht besser ist, das Ausgabeformat nochmal zu ueberdenken.

Gerrit

Verfasst: Freitag 27. Februar 2009, 08:54
von Elchsfell
Das Ausgabeformat ist vorgegeben von einer CFD-Post_Processing Software, daran kann ich nichts ändern. Über mein erstes Skript bediene ich diese Software ohne GUI, da die Auswertung dann schneller abläuft...
Daher werde ich an diesem Format nichts ändern können.

Verfasst: Freitag 27. Februar 2009, 08:59
von BlackJack
Naja soo dramatisch ist das Format nun auch wieder nicht. Splitten, die Elemente rauspicken, die man haben möchte, und dann in Zahlen umwandeln ist ziemlich einfach.

Code: Alles auswählen

In [313]: line
Out[313]: 'Position: -0.3992 -2.79143e-19 -2.82073e-13 Vector: 0.00011165 -1.164
03e-12 -1.17624e-06 Age: 2.39809e-07'

In [314]: line.split()
Out[314]:
['Position:',
 '-0.3992',
 '-2.79143e-19',
 '-2.82073e-13',
 'Vector:',
 '0.00011165',
 '-1.16403e-12',
 '-1.17624e-06',
 'Age:',
 '2.39809e-07']

In [315]: operator.itemgetter(1, 2, 3, 5, 6, 7, 9)(line.split())
Out[315]:
('-0.3992',
 '-2.79143e-19',
 '-2.82073e-13',
 '0.00011165',
 '-1.16403e-12',
 '-1.17624e-06',
 '2.39809e-07')

In [316]: map(float, operator.itemgetter(1, 2, 3, 5, 6, 7, 9)(line.split()))
Out[316]:
[-0.3992,
 -2.7914300000000002e-19,
 -2.8207299999999999e-13,
 0.00011165,
 -1.16403e-12,
 -1.1762399999999999e-06,
 2.39809e-07]

Verfasst: Freitag 27. Februar 2009, 09:11
von kbr
Elchsfell hat geschrieben:Position: -0.3992 -2.79143e-19 -2.82073e-13 Vector: 0.00011165 -1.16403e-12 -1.17624e-06 Age: 2.39809e-07
Position: -0.3992 -4.46599e-18 -4.51293e-12 Vector: 0.00055821 -5.8197e-12 -5.88088e-06 Age: 9.59235e-07

...

Nun will ich die Positionen und die Vektoren auslesen, beispielsweise so:
PosX1 = -0.3992
PosY1 = -2.79143e-19

Ich brauch also einen Befehl, mit welchem ich explizit einen Eintrag in einer Zeile mit der entsprechenden Spalte ansprechen kann.
Mit diesen Positionen muss ich dann weiterarbeiten.
Hmm, wenn ich das richtig verstanden haben, ist das eigentlich gar nicht so schwer. Sei "line" eine Zeile aus der Textdatei, dann gelangst Du an die Spaltenwerte mit

Code: Alles auswählen

values = line.split(' ')
PosX, PosY = float(values[1]), float(values[2])
usw.

Ob das jetzt besonders performant ist sei mal dahingestellt, aber zumindest kannst Du die Daten so lesen und ggf. in ein für Deine Zwecke geeigneteres Format überführen.

Verfasst: Freitag 27. Februar 2009, 10:01
von Elchsfell
Wow, vielen Dank.
Genau sowas habe ich gesucht.

Die Performance des Python Skripts ist bei mir nicht die limitierende Größe, da die zu bearbeitenden Strömungsfelder mehrere GB groß sind und das Skript sozusagen immer auf die Daten aus der Auswertung "warten" muss...

Liebe Grüße,
Elchsfell