Seite 1 von 1

Tabelle einlesen und auswerten

Verfasst: Mittwoch 24. August 2011, 10:50
von kleiner.epsilon
Hallo,
ich habe eine Datei/Tabelle einlesen mit mehreren hundert Zeilen, die folgendes Format hat:
1.23 1.32 1.43 0.43 0.57 12345 1 2 19.5
0.23 1.34 1.53 0.67 1.37 12346 1 2 239.5
1.45 0.32 0.47 1.43 0.52 12346 1 2 7.5
Mich interessieren aber nur die Zeilen, bei denen der Wert in der letzten Spalte (Residium) kleiner 10 ist.
Diese Zeilen sollen in eine neue Datei geschrieben werden.

Ich habe es mit read(), readline() versucht, er liest die Zeile als String(?) ein, aber ich muss ja den letzten Wert vergleichen können.
Ich dachte, ich könnte eine Zeile als Liste einlesen und den letzten Eintrag der Liste vergleichen, iteriert über die ganze Tabelle.

Eine andere Idee von mir war, die ganze Tabelle zu sortieren, macht's aber mit sort() nur nach der 1.Spalte (klar!).

Wäre dankbar für einen Tipp, welchen Befehl ich verwenden kann.

Re: Tabelle einlesen und auswerten

Verfasst: Mittwoch 24. August 2011, 11:01
von deets

Code: Alles auswählen

line = "0.23 1.34 1.53 0.67 1.37 12346 1 2 239.5"
values = [float(part) for part in line.split()]

Re: Tabelle einlesen und auswerten

Verfasst: Mittwoch 24. August 2011, 11:06
von nezzcarth
Muss es denn Python sein? Weil in awk wäre das ein Einzeiler:

Code: Alles auswählen

awk '$NF < 10.0 {print $NF}' eingabe > ausgabe  
Das richtige Werkzeug für den richtigen Zweck...oder so ;)

Re: Tabelle einlesen und auswerten

Verfasst: Mittwoch 24. August 2011, 11:32
von kleiner.epsilon
@deets: Danke!! Damit hat es funktioniert.

@nezzcarth: nein, es muss nicht in Python sein, aber weil ich mich gerade da einarbeite, dachte ich, kann es ja nicht so schwer sein.
awk kannte ich nicht.

Re: Tabelle einlesen und auswerten

Verfasst: Mittwoch 24. August 2011, 11:50
von BlackJack
Alternativ zur „list comprehension” (LC):

Code: Alles auswählen

values = map(float, line.split())

Re: Tabelle einlesen und auswerten

Verfasst: Mittwoch 24. August 2011, 12:00
von CM

Code: Alles auswählen

awk '$NF < 10.0 {print $0}' eingabe-File > ausgabe-File
Wäre die awk-Alternative, falls die gesamte Zeile und nicht nur das letzte Feld ausgegeben werden soll (so habe ich es verstanden).

Alldieweil, Python ist bei I/O-intensiven Aufgaben oftmals nicht viel langsamer - und IMHO einfacher im Gedächtnis zu halten.

Re: Tabelle einlesen und auswerten

Verfasst: Mittwoch 24. August 2011, 12:02
von Hyperion
kleiner.epsilon hat geschrieben: Ich habe es mit read(), readline() versucht, er liest die Zeile als String(?) ein, aber ich muss ja den letzten Wert vergleichen können.
Man kann auch direkt über die Zeilen einer Textdatei iterieren:

Code: Alles auswählen

def parse(filename):
    with open(filename, "r") as infile:
        for line in infile:
            values = map(float, line.split())
            if values[-1] < 10:
                yield values
Interessant ist hier also die Zeile drei.

Re: Tabelle einlesen und auswerten

Verfasst: Mittwoch 24. August 2011, 14:50
von nezzcarth
CM hat geschrieben:

Code: Alles auswählen

awk '$NF < 10.0 {print $0}' eingabe-File > ausgabe-File
Wäre die awk-Alternative, falls die gesamte Zeile und nicht nur das letzte Feld ausgegeben
Jetzt, wo du's sagst :oops: Eigentlich braucht man sogar nur print ohne die Variable.

Ob sich eine Beschäftigung mit awk lohnt, ist eh noch mal eine eigene Frage. Die meisten Fragestellungen kann man wie du schon sagtest auch anderweitig lösen; da braucht man nicht eine Weile eine antike Programmiersprache lernen, um sich dann alle paar Monate darüber zu freuen, dass man eine Aufgabe etwas einfacher lösen konnte. Ich fand eben nur, dass das für die Fragestellung wie die Faust auf's Auge passte, und wenn man öfter mit solchen Messdaten oder was das ist in Tabellenform hantiert lohnt es sich vielleicht, mal ein, zwei Stunden zu investieren um die Grundlagen zu lernen. Ist vielleicht ganz praktisch zu wissen, welche Werkzeuge prinzipiell existieren. Dazu kommt halt, dass ein Python-Script für mich programmieren ist, während sich so ein Einzeiler eher wie ein etwas komplexerer Kommandozeilenparameter anfühlt; aber das ist wohl 'ne Kopfsache ;)

Re: Tabelle einlesen und auswerten

Verfasst: Mittwoch 24. August 2011, 15:06
von CM
Och, ich geb' Dir absolut recht. Und es kann auch nicht schaden ab und an über den Tellerrand zu blicken.

Und 'print $0' ist fast ein bißchen pythonisch: Explizit statt implizit ;-).