File auslesen die 2., Textspalte nach liste

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
linde_user
User
Beiträge: 25
Registriert: Mittwoch 20. April 2005, 11:47

Hallo an alle Hilfsbereiten Programmierexperten,
ich habe folgendes Problem: ich will Zahlenspalten, welche sich am Ende eines Textfiles befinden auslesen, und in eine Liste umwandeln. Hier ist mal folgende Beispieldatei:
PATH PLOT
lcase1
Inc : 49
Time : 9.800000e-01
Pres : 0.000000e+00

Curve 1
X : Arc Length
Y : Equivalent Von Mises Stress Layer 1

Node X Y
----------------------------------------
87 0.000000e+00 7.430990e+02
12 1.851562e+00 5.764913e+02
13 3.726562e+00 9.063725e+02
14 5.671875e+00 1.055981e+03
Als Lösungsansatz habe ich auf empfehlung meines Pythonbuches das Structmodul verwendet. Mit folgendem Programmcode:

Code: Alles auswählen

#!/usr/bin/env python

import struct
recordFormat='hdd'
recordSize=struct.calcsize(recordFormat)
resultList=[]

count=12
f=open("/home/tfr002/test/vm.txt", "rb")
while f.readline() is not "":
  count=count+1
  record=f.read(recordSize)
  resultList.append(struct.unpack(recordFormat, record))
  if record=='':
    f.close()
    break
print resultList
Das mit dem Count soll erzeugen, dass er erst bei den Spalten anfängt zu "arbeiten". Als Fehlermeldung kommt dann
....
resultList.append(struct.unpack(recordFormat, record))
struct.error: unpack str size does not match format
kann mir jemand einen Tip geben?
Zuletzt geändert von linde_user am Mittwoch 20. April 2005, 15:13, insgesamt 2-mal geändert.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

linde_user hat geschrieben:ich will Zahlenspalten, welche sich am Ende eines Textfiles befinden auslesen, und in eine Liste umwandeln.
Okay, du hast die Beispieldatei gepostet. Wie soll denn die Liste aussehen, die aus der Datei hätte generiert werden sollen?
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
linde_user
User
Beiträge: 25
Registriert: Mittwoch 20. April 2005, 11:47

Eigentlich ist das Ziel jede Spalte als individuelle Liste zu erzeugen, oder alle als eine Art Matrix:
Entweder
[123,.., , ..]
[456, .., ...]
[789,..., .., ..]

oder
[[123,456,789], [..., ..., ....], [..], [...], ..]
linde_user
User
Beiträge: 25
Registriert: Mittwoch 20. April 2005, 11:47

kann es sein, dass der recordFormat exakt die gleiche Struktur, wie die aufzunehmenden daten besitzen muss?, also

Code: Alles auswählen

recordFormat='  h  d  d' ?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Geht auch ohne struct:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

def main():
    f = file('vm.txt', 'r')
    cols = []
    for line in f:
        sline = line.split()
        try:
            v1 = int(sline[0])
            v2 = sline[1]
            v3 = sline[2]
            vals = [v1, v2, v3]
            cols.append(vals)
        except ValueError:
            pass
        except IndexError:
            pass
    f.close()
    
    print cols

if __name__ == '__main__':
    main()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
linde_user
User
Beiträge: 25
Registriert: Mittwoch 20. April 2005, 11:47

Die Idee ist super, aber er meint:
File ...
...def main()

SyntaxError: invalid syntax
:?:

Du willst durch das file springen und einfach alle zeilen die nicht dem Muster entsprechen ausklammern? :idea:
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

linde_user hat geschrieben:Die Idee ist super, aber er meint:
File ...
...def main()

SyntaxError: invalid syntax
:?:
Weil du den Code falsch hast. Er meint das deswegen weil bei dem main() der Doppelpunkt fehlt. In dem Code den ich dir gepostet habe ist er aber definitiv vorhanden.
linde_user hat geschrieben:Du willst durch das file springen und einfach alle zeilen die nicht dem Muster entsprechen ausklammern? :idea:
Warum nicht? In Python muss man Problemen nicht immer vorbeugen. Dank Exceptions kann man sich auch das Leben vereinfachen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
linde_user
User
Beiträge: 25
Registriert: Mittwoch 20. April 2005, 11:47

OK, ich nehme den blödheitspreis für den : dankend entgegen.

Er meckert nun an der Zeile
f=file(....)

NameError: file
herum. Vor die Fileangabe kommt aber schon noch der Pfad (/gg/gg/vm.txt) oder?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Jaja, aber bei mir war halt der Pfad anders.

Sagmal, was hast du denn für ein Python? Nimm statt file() open(), kommt auf's gleiche.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
linde_user
User
Beiträge: 25
Registriert: Mittwoch 20. April 2005, 11:47

Also ich arbeite (ist mir peinlich) :oops: mit Python 1.5. Eine höher Version kann der Betreuer der DA erst in 2 Wochen installieren.
ich habe mal folgenden Text zusammengeschrieben:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

def main():
    f=open('/home/tfr002/test/vm.txt', 'r')
    cols=[]
    inh=f.readlines()
    for line in inh:
      sline=line.split()
      try:
        v1=int(sline[0])
        v2=sline[1]
        v3=sline[2]
        vals=[v1, v2, v3]
        cols.append(vals)
      except ValueError:
        pass
      except IndexError:
        pass
    f.close()

    print cols

if __name__=='__main__':
    main()
Dann kommt
sline=line.split()
AttributeError: 'string' has no object attribute 'split'
liegt das an meiner Steinzeitversion? Der Pfad ist definetly correct
Übrigens Danke für das tolle Engagement!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

linde_user hat geschrieben:
AttributeError: 'string' has no object attribute 'split'
liegt das an meiner Steinzeitversion?
Erraten! Dann musst du noch das Modul string importieren und statt line.split machst du dann sline = string.split(sline) (was aber inzwischen schon lange nicht mehr elegant ist).

Und die Pythonversion solltest du unbedingt updaten, denn sonst bist du eigentlich die ganze Zeit beschäftigt workarounds zu bauen, statt sich an den neuen Features zu erfreuen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
linde_user
User
Beiträge: 25
Registriert: Mittwoch 20. April 2005, 11:47

Ok, ich probiers mal.
Danke vorerst. Damit hast Du dir ein Bier verdient :D
linde_user
User
Beiträge: 25
Registriert: Mittwoch 20. April 2005, 11:47

OK, ich hab es hinbekommen:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*-

import string

def main():
    f=open('/home/tfr002/test/vm.txt', 'r')
    cols=[]
    inh=f.readlines()
    for line in inh:
      sline=string.split(line)
      try:
        v1=int(sline[0])
        v2=sline[1]
        v3=sline[2]
        vals=[v1, v2, v3]
        cols.append(vals)
      except ValueError:
        pass
      except IndexError:
        pass
    f.close()

    print cols

if __name__=='__main__':
    main()
Antworten