Auslesen von Variablen aus Textdatei

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
Elchsfell
User
Beiträge: 5
Registriert: Donnerstag 26. Februar 2009, 13:29
Wohnort: Stuttgart

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.
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

Du suchst das csv-Modul
Elchsfell
User
Beiträge: 5
Registriert: Donnerstag 26. Februar 2009, 13:29
Wohnort: Stuttgart

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?
derdon
User
Beiträge: 1316
Registriert: Freitag 24. Oktober 2008, 14:32

In dem Fall gibt es zwar Alternativen, aber keine empfehlenswerten / nennenswerten. Excel brauchst du übrigens nicht :wink:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ...)
Elchsfell
User
Beiträge: 5
Registriert: Donnerstag 26. Februar 2009, 13:29
Wohnort: Stuttgart

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

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
Elchsfell
User
Beiträge: 5
Registriert: Donnerstag 26. Februar 2009, 13:29
Wohnort: Stuttgart

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.
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]
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

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.
Elchsfell
User
Beiträge: 5
Registriert: Donnerstag 26. Februar 2009, 13:29
Wohnort: Stuttgart

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
Antworten