Text spaltenweise lesen

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
Queiser
User
Beiträge: 2
Registriert: Dienstag 31. März 2020, 15:33

Hallo zusammen.
Bin leider zwecks meines (einfachen) Problems im Netz nicht fündig geworden.
Ich habe eine Textdatei "text.txt"

Code: Alles auswählen

-----------------------------------------------
         x         y         t
-----------------------------------------------
         0         0         0
         0     -9.31         1
         0    -28.43         2
         0    -57.36         3
         0     -96.1         4
Und ich möchte ganz einfach diesen zeilenweise einlesen und zusätzlich mir die einzelnen Parameter rausfischen, indem ich z.B. in einer Zeile von Spalte 0 bis 9, dann von 9 bis 16, usw. einlese.
Wie Kann ich das machen?
Danke im voraus.
Benutzeravatar
__blackjack__
User
Beiträge: 13077
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Queiser: Die Daten sehen so als als wenn man hier noch einfach mit `split()` arbeiten könnte. Wirklich feste Positionen braucht man erst wenn in den Werten selbst auch Leerzeichen bzw. „whitespace“-Zeichen allgemein auftreten können. Ansonsten arbeite mal das Tutorial in der Python-Dokumentation durch. Slicing ist das Stichwort. Das geht mit Sequenztypen, also auch mit Zeichenketten.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
nezzcarth
User
Beiträge: 1633
Registriert: Samstag 16. April 2011, 12:47

Die Datei sieht so aus, als wäre das auch eher ein Format, das für die Anzeige und nicht die maschinelle Verarbeitung optimiert ist. Wenn das Format durchgängig der gezeigten Struktur entspricht, ist es nicht kompliziert, das einzulesen, aber falls du die Möglichkeit hast, die Daten in einem anderen Format (zum Beispiel CSV) zu erhalten, wäre ein kleines bisschen einfacher (z.B. die Trennlinien brauchen zur Zeit eine kleine Sonderbehandlung, das ist nicht schwierig, aber unpraktisch. In CSV hat man so etwas nicht).
Queiser
User
Beiträge: 2
Registriert: Dienstag 31. März 2020, 15:33

Danke für die Antwort.
Habe mir mal dieses slice() durchgelesen. Wo besteht jetzt noch mal genau der Unterschied dazu, einfach eine Stringkette einzuschneiden mit zum Beispiel:
x_wert = float(zeile_String[0:10])?

Habe jetzt meinen code wie folgt geschrieben:

Code: Alles auswählen

dateiname = "C:\\Users\\..............\\x_y_Werte.txt"
a = []
with open(dateiname, 'r') as f:
   for zeile in f:
       a.append(str(zeile))

x_werte = []
y_werte = []
t_werte = []

for i in range(3,len(a)):   #Start ab 3, um die ersten 3 Zeilen nicht mitzulesen

    string_wert = a[i]
    x = float(string_wert[0:10])
    y = float(string_wert[11:20])
    t = float(string_wert[21:30])
   
    x_werte.append(x)
    y_werte.append(y)
    t_werte.append(t)
    
Funktioniert soweit. Ich kann die Werte rausfischen und in float umwandeln und der Liste hinzufügen. Würde slice() mir weitere Erleichterungen/Vorteile verschaffen?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

Dateien sollte man immer mit dem passenden Encoding öffnen. Eingerückt wird immer mit 4 Leerzeichen pro Ebene, nicht mal 3 und mal 4.
Zeilen in einer Datei sind schon Strings, die nochmal mit str zu konvertieren ist unsinnig.
Variablennamen sollten aussagekräftig sein, `a` ist das nicht. Alles ist ein Wert, string_wert ist also nichts aus. Statt drei einzelne Listen, solltest Du eine Liste mit Tupeln verwenden.
Über einen Index zu iterieren, ist ein anti-Pattern, weil man direkt über die Elemente iterieren könnte.
Und split ist einfach robuster und einfacher:

Code: Alles auswählen

from itertools import islice

FILENAME = "C:\\Users\\..............\\x_y_Werte.txt"
werte = [] # besserer Name, was für Werte
with open(dateiname, 'r') as zeilen:
    for zeile in islice(zeilen, 3, None): # erste drei Zeilen ignorieren
        werte.append(tuple(map(float, zeile.split())))
Antworten