Tabelle einlesen und auswerten

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
kleiner.epsilon
User
Beiträge: 25
Registriert: Sonntag 31. Oktober 2010, 14:31

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.
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()]
nezzcarth
User
Beiträge: 1783
Registriert: Samstag 16. April 2011, 12:47

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 ;)
kleiner.epsilon
User
Beiträge: 25
Registriert: Sonntag 31. Oktober 2010, 14:31

@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.
BlackJack

Alternativ zur „list comprehension” (LC):

Code: Alles auswählen

values = map(float, line.split())
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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

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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
nezzcarth
User
Beiträge: 1783
Registriert: Samstag 16. April 2011, 12:47

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 ;)
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

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 ;-).
Antworten