TXT Datei einlesen und plotten

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
Kriccemis
User
Beiträge: 15
Registriert: Freitag 8. Mai 2020, 20:10

Hallo Community,

ich bin ein absoluter Anfänger auf dem Gebiet Programmierung und auch in Python und komme nur sehr langsam voran.

Für ein kleines Projekt soll ich eine TXT Datei einlesen (bestehend aus 2 Spalten mit TAB getrennt und etwa 100 Zeilen), auch wenn das mit Sicherheit sehr einfach ist, scheitere ich bereits an dieser Hürde.
Ich habe die Daten in einen String eingelesen und möchte diesen nun mit dem split Befehl in x (Zeile 1) und y (Zeile 2) aufteilen und grafisch darstellen.
Kann mir vielleicht jemand eine Hilfetellung geben, wie ich diese Trennung realisieren kann?

VG und Danke
nezzcarth
User
Beiträge: 1651
Registriert: Samstag 16. April 2011, 12:47

Das klingt nach einer tsv Daite. Verarbeite die Daten doch mit dem csv Modul, indem du '\t' als Trenner setzt. Wenn du es per Hand machen möchtest, lies nicht die gesamte Datei in einen einzigen String, sondern zeilenweise ein. Das Ergebnis sollte eine Liste von Listen mit zwei Elementen oder 2er Tupeln sein.
Kriccemis
User
Beiträge: 15
Registriert: Freitag 8. Mai 2020, 20:10

Danke für die schnelle Antwort. Sitze seit 6 Uhr schon wieder dran und übe...
Wo absolut meine Verständisprobleme liegen ist die Trennung der einzelnen Werte im Dokument um x und y Koordinaten für den Plot zu erhalten.
Ich wäre sehr dankbar wenn jemand einen Beispielcode hätte der dieses Problem auflöst.

Der Vollständigkeit halber "meine komplette Hausaufgabe": Daten aus TXT einlesen, Numpy Array erstellen und Daten im X-Y-Diagramm plotten.

VG und danke für eure Hilfe.
Kriccemis
User
Beiträge: 15
Registriert: Freitag 8. Mai 2020, 20:10

Nachtrag: Ich habe zum Üben die TXT Datei in 2 einzelne Dateien aufgespalten um X und Y sepaarat einlesen zu können. Jetzt habe ich das Problem, dass ich nach jemden Wert \n stehen habe und ich dadruch den String nicht in Float ändern kann. Gibt es einen einfachen Befehl, der \n entfernt? Habe im Netzt irgendwie nicht so richtig was gefunden.
Benutzeravatar
__blackjack__
User
Beiträge: 13270
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kriccemis: Numpy bringt Funktionen mit um Textdateien in Numpy-Arrays zu laden. Du machst Dir da vielleicht zu viel Arbeit. Andererseits solltest Du das eigentlich auch selbst hinbekommen, denn das ist wirklich nicht schwer. Man muss halt die Grundlagen lernen.

Das Problem mit dem "\n" verstehe ich nicht. Ist das tatsächlich ein Problem? Dann zeig da mal bitte Code und die konkrete komplette Fehlermeldung. Oder glaubst Du bloss da wäre ein Problem?

Code: Alles auswählen

In [166]: float(" 42.23\n")                                                      
Out[166]: 42.23
Edit: Nicht irgendwo im Netz suchen. Python hat eine Dokumentation, da stehen beispielsweise alle Methoden die Zeichenketten so haben beschrieben und das sind Grundlagen die man drauf haben sollte.
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
nezzcarth
User
Beiträge: 1651
Registriert: Samstag 16. April 2011, 12:47

Na ja, eben wegen dieser Probleme habe das CSV-Modul vorgeschlagen. Wenn es aber eh numpy sein soll, kannst du ja auch numpy.loadtxt vewenden. (https://docs.scipy.org/doc/numpy/refere ... adtxt.html).

Das CSV-Modul und auch numpy.loadtxt erledigen das Einlesen inkl. splitten, entfernen von Zeilenumbrüchen etc. für dich.

Wenn du es wirklich per Hand machen möchtest, ist das auch nicht schwierig. Wie gesagt: Lies die Datei zeilenweise ein. Anschließend brauchst du noch 'split' zum trennen und (ggf. aber nicht unbedingt) 'rstrip' zum entfernen von Zeilenumbruchsmarkern. Zahlen solltest du zudem in einen entsprechenden Typ (int, float) konvertieren. Falls da Probleme bestehen, solltest du ggf. das offizielle Python-Tutorial auf der Python-Website durcharbeiten. Diese Grundlagen werden dort erklärt.
Kriccemis
User
Beiträge: 15
Registriert: Freitag 8. Mai 2020, 20:10

Mit den Grundlagen erlernen gebe ich dir recht, habe mir dafür auch heute noch ein Fachbuch gekauft. Problem ist nur, dass ein Kollege das Team verlässt und er die komplette Programmierung gemacht hat und ich leider der "Depp" bin, der sich innerhalb von 3 Wochen die wesentlichen Schritte in dem Code verstehen soll. Die Grundlagen werde ich weiterhin parrall dazu durcharbeiten. Pure verzweiflug ist auf alle Fälle erkennbar...

Der Code ist bisher nicht wirklich viel aber hier das was funktioniert:

Auszug aus TXT:
1200,0000 -0,000379015
1199,8000 -0,000474726
1199,6000 -0,000424327
1199,4000 -0,000194115

Code: Alles auswählen

import numpy as np
import matplotlib.pyplot as plt


with open("181119_rods_1_ctrl-1_mod.txt", "r") as file:
    data = file.readlines()
    data = np.array(data, dtype=float)	# Fehlermeldung: ValueError: could not convert string to float: '1200,0000\t-0,000379015\n'

# plt.plot(data2)
# plt.xlabel("x Werte")
# plt.ylabel("y Werte")
# plt.show()
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

Komisch, warum hängt das an einer Person? Zum Laden gibt es numpy.loadtxt.
nezzcarth
User
Beiträge: 1651
Registriert: Samstag 16. April 2011, 12:47

Das Komma als Dezimaltrenner ist etwas unpraktisch. Falls du das beeinflussen kannst, mach einen Punkt daraus.

Code: Alles auswählen

Der Code ist bisher nicht wirklich viel aber hier das was funktioniert:
Das ist schon einmal ein Anfang. Die bisherigen Vorschläge. Die du erhalten hast, sind da jedoch nicht eingeflossen. Dadurch, dass du nicht die existierenden Methoden zum Einlesen solcher Daten verwendest, bringst du dich selbst in die Situation, tiefer in Python einsteigen zu müssen. Schwierig ist das auch nicht, aber es setzt den sicheren Umgang mit Schleifen, Listen und String-Operationen voraus.
Benutzeravatar
__blackjack__
User
Beiträge: 13270
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Kriccemis: Da hast Du jetzt zwei verschiedene Dinge `data` genannt. So etwas wird schnell unübersichtlich.

Hier ist in den Daten jetzt ein Detail was bisher noch nicht bekannt war: Die Zahlen verwenden ein Dezimalkomma statt eines Dezimalpunktes. Das müsste man für die Numpy-Funktion(en) zum einlesen vorher ändern. Also beispielsweise in dem man `np.loadtxt()` kein Dateiobjekt, sondern einen Generatorausdruck übergibt in dem man die Kommas durch Punkte ersetzt.

Oder man schreibt das ohne Numpy ”von Hand” und mit Listen. Das ist bei 100 Eingabezeilen ja kein Problem für das man unbedingt eine effiziente Speicherung als Array benötigt.

Was verstehst Du denn an dem Fehler den Du bekommst nicht? Der ist doch eigentlich recht offensichtlich. Du hast Dir angeschaut was in `data` (Nummer 1) an Werten steht‽

Die `readlines()`-Methode ist übrigens selten nützlich. Eigentlich nie. Da Dateiobjekte iterierbar sind (über die enthaltenen Zeilen) muss man in der Regel die Daten gar nicht erst komplett in den Speicher laden. Falls man die Zeilen doch komplett in einer Liste haben möchte, kann man auch einfach ``data = list(file)`` schreiben, mit dem Vorteil, dass man nicht nur Dateiobjekte übergeben kann, sondern jedes iterierbare Objekt das entsprechende Werte liefert.

@nezzcarth: Ob man nun die Grundlagen mit Schleifen, Listen, und Zeichenkettenoperationen lernt, oder sich mit Generatorausdrücken und Zeichenkettenoperationen auseinander setzt ist für einen Anfänger wahrscheinlich erst einmal egal. 😎
Please call it what it is: copyright infringement, not piracy. Piracy takes place in international waters, and involves one or more of theft, murder, rape and kidnapping. Making an unauthorized copy of a piece of software is not piracy, it is an infringement of a government-granted monopoly.
Antworten