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.
Tabelle einlesen und auswerten
-
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()]
Muss es denn Python sein? Weil in awk wäre das ein Einzeiler:
Das richtige Werkzeug für den richtigen Zweck...oder so 
Code: Alles auswählen
awk '$NF < 10.0 {print $NF}' eingabe > ausgabe
-
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.
@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())Code: Alles auswählen
awk '$NF < 10.0 {print $0}' eingabe-File > ausgabe-FileAlldieweil, Python ist bei I/O-intensiven Aufgaben oftmals nicht viel langsamer - und IMHO einfacher im Gedächtnis zu halten.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Man kann auch direkt über die Zeilen einer Textdatei iterieren: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.
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
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
Jetzt, wo du's sagstCM hat geschrieben:Wäre die awk-Alternative, falls die gesamte Zeile und nicht nur das letzte Feld ausgegebenCode: Alles auswählen
awk '$NF < 10.0 {print $0}' eingabe-File > ausgabe-File
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
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
.
Und 'print $0' ist fast ein bißchen pythonisch: Explizit statt implizit
