Seite 1 von 1

File auslesen die 2., Textspalte nach liste

Verfasst: Mittwoch 20. April 2005, 14:01
von linde_user
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?

Re: File auslesen die 2., Textspalte nach liste

Verfasst: Mittwoch 20. April 2005, 14:42
von Leonidas
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?

Verfasst: Mittwoch 20. April 2005, 15:00
von linde_user
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], [..., ..., ....], [..], [...], ..]

record size

Verfasst: Mittwoch 20. April 2005, 15:16
von linde_user
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' ?

Verfasst: Mittwoch 20. April 2005, 15:29
von Leonidas
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()

SyntaxError

Verfasst: Mittwoch 20. April 2005, 16:01
von linde_user
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:

Re: SyntaxError

Verfasst: Mittwoch 20. April 2005, 16:13
von Leonidas
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.

NameError

Verfasst: Mittwoch 20. April 2005, 16:36
von linde_user
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?

Verfasst: Mittwoch 20. April 2005, 16:44
von Leonidas
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.

Geht fast

Verfasst: Mittwoch 20. April 2005, 16:58
von linde_user
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!

Re: Geht fast

Verfasst: Mittwoch 20. April 2005, 17:13
von Leonidas
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.

OK

Verfasst: Mittwoch 20. April 2005, 17:16
von linde_user
Ok, ich probiers mal.
Danke vorerst. Damit hast Du dir ein Bier verdient :D

So funktionierts

Verfasst: Donnerstag 21. April 2005, 06:59
von linde_user
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()