Problem mit Einlesen von txt-Dateien

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
Mertitare
User
Beiträge: 5
Registriert: Dienstag 3. November 2015, 12:57

Guten Tag an alle ^^,
also so langsam bin ich am Verzweifeln und brauche Hilfe.
Ich habe eine txt-Datei mit zwei Spalten. Diese Datei lese ich ein mache daraus zwei Spalten und möchte die dann ploten.
So sieht die txt-Datei aus:
Zeit Messwerte
1 5
2 6
3 7
4 8
5 2
6 9
7 3
8 4
9 8
10 6

Hier ist der Programm-Code:

Code: Alles auswählen

from pylab import *
from pandas import *
file = open('Messwerte.txt')
line = read_table('Messwerte.txt',skiprows=0,sep='\t*',engine ='python')
x = []; y = []

for line in file:
    xval , yval = line.split()
    x.append(float(xval))
    y.append(float(yval))


plt.xlabel('Zeit [ms]')
plt.ylabel('Kraft')
plot(x,y)

Ich bekomme folgende Fehlermeldung:
ValueError: could not convert string to float: 'Zeit'

Wobei ich das eigentlich mit skiprows umgehen möchte.
Das merkürdigste ist wenn man nun file = open('Messwerte.txt') auskommentiert funktioniert das Programm einmal. Beim mehrmaligem Ausführen mit der Zeile auskommentiert, kommt keine Fehlermeldung jedoch fehlt der Graph.
Vielen Dank im Vorraus für Anregungen,Tipps und Lösungen
Benutzeravatar
sparrow
User
Beiträge: 4165
Registriert: Freitag 17. April 2009, 10:28

Ohne deinen Code angeschaut zu haben:

Du versuchst die Umwandlung der beiden Spalten in float-Werte auch bei der ersten Zeile. Dort steht allerdings das Wort "Zeit", das kann aber nicht in einen float-Wert umgewandelt werden.

Du musst also entweder sicherstellen, dass alle Werte in einen float-Wert umgewandelt werden können (z.B. Überschrift entfernen), oder die Möglichkeit, dass es kein float-Wert ist entsprechend behandeln (entweder die erste Zeil beim Einlesen überspringen, oder vorher schauen was in der Zeile steht oder den Fehler entsprechend abfangen und behandeln.
BlackJack

@Mertitare: Das `skiprows` mag ja beim `read_table()` (wo kommt das eigentlicher her? → Sternchen-Importe sind doof!) helfen, aber wieso sollte das irgendeinen Einfluss auf das manuelle öffnen und lesen der Datei haben?

Schau Dir doch mal an was `read_table()` zurück gibt. `line` ist dafür ziemlich sicher der falsche Name!

Edit: Der Wert bei `skiprows` ist mit 0 vielleicht auch nicht ganz das richtige. Lies mal in der Dokumentation nach was der Wert bedeutet.
Mertitare
User
Beiträge: 5
Registriert: Dienstag 3. November 2015, 12:57

Vielen Dank schonmal für die Antworten,
@sparrow: Das Aussehen der txt-Datei kann ich leider nicht ändern.
@BlackJack Das read_Table() kommt von Pandas.^^
Die Funktion Pandas.read_table() gibt ein Data_Frame zurück.
skiprows = 0 passt, da er dann die 0.te Zeile überspringt

Wie gesagt das Programm funktioniert wenn ich die file = ...... Zeile auskommentiere einmal danach nicht mehr
BlackJack

@Mertitare: ``skiprows=0`` überspringt 0 Zeilen, also gar keine, das passt also nicht wenn man Zeilen überspringen will. Bei `read_table()` möchte man die letztendlich aber auch gar nicht überspringen, denn das die erste Zeile die Namen der Spalten enthält ist für einen `DataFrame` sogar gut, weil man die Spalten dann über diese Namen ansprechen kann, was verständlicher ist als magische Indexwerte.

Warum verwendest Du nicht den `DataFrame` statt den komplett zu ignorieren und die Daten noch mal manuell in Listen einzulesen?

Wenn man die ``file =``-Zeile auskommentiert dann funktioniert das Programm gar nicht, weil dann in der ``for``-Schleife versucht wird über ein Objekt zu iterieren das nicht definiert wurde. Sollte das bei Dir tatsächlich funktionieren, dann verwendest Du eine IDE die im Namensraum des Programms Werte von vorherigen Läufen und/oder interaktiver Nutzung der Python-Shell hinterlässt. Das wäre gar nicht gut, weil dann die Wiederholbarkeit von Programmausführungen nicht mehr so ohne weiteres gewährleistet ist.

Code: Alles auswählen

import pandas as pd
from matplotlib import pyplot as plt


def main():
    data = pd.read_table('test.csv')
    plt.xlabel('Zeit [ms]')
    plt.ylabel('Kraft')
    plt.plot(data.Zeit, data.Messwerte)
    plt.show()


if __name__ == '__main__':
    main()
(Test)
Mertitare
User
Beiträge: 5
Registriert: Dienstag 3. November 2015, 12:57

BlackJack hat geschrieben:@Mertitare: ``skiprows=0`` überspringt 0 Zeilen, also gar keine, das passt also nicht wenn man Zeilen überspringen will. Bei `read_table()` möchte man die letztendlich aber auch gar nicht überspringen, denn das die erste Zeile die Namen der Spalten enthält ist für einen `DataFrame` sogar gut, weil man die Spalten dann über diese Namen ansprechen kann, was verständlicher ist als magische Indexwerte.

Warum verwendest Du nicht den `DataFrame` statt den komplett zu ignorieren und die Daten noch mal manuell in Listen einzulesen?

Wenn man die ``file =``-Zeile auskommentiert dann funktioniert das Programm gar nicht, weil dann in der ``for``-Schleife versucht wird über ein Objekt zu iterieren das nicht definiert wurde. Sollte das bei Dir tatsächlich funktionieren, dann verwendest Du eine IDE die im Namensraum des Programms Werte von vorherigen Läufen und/oder interaktiver Nutzung der Python-Shell hinterlässt. Das wäre gar nicht gut, weil dann die Wiederholbarkeit von Programmausführungen nicht mehr so ohne weiteres gewährleistet ist.

Code: Alles auswählen

import pandas as pd
from matplotlib import pyplot as plt


def main():
    data = pd.read_table('test.csv')
    plt.xlabel('Zeit [ms]')
    plt.ylabel('Kraft')
    plt.plot(data.Zeit, data.Messwerte)
    plt.show()


if __name__ == '__main__':
    main()
(Test)
@BlackJack Vielen,vielen Dank
Jedoch verstehe ich noch nicht alles.
Wieso überspringt dein Code die erste Zeile ? Wegen der if-Anweisung am Ende ?
Und warum pd.read_table ?
Bzw. ist das die Methode die ich selber programmieren wollte ?
Vielen Dank im Vorraus
BlackJack

@Mertitare: Das Programm überspringt die erste Zeile nicht — `pandas.read_table()` geht davon aus das in der ersten Zeile der Datei die Spaltennamen stehen und liest die dementsprechend auch ein. Darum kann man ja später über diese Namen (`Zeit` und `Messwerte`) auch auf die Spaltendaten zugreifen, was nicht ginge wenn man die Zeile einfach komplett ignorieren würde.

Warum nicht `pandas.read_table()`? Das liest die Daten in einen `DataFrame` ein — hast Du doch selbst schon festgestellt. Dann sind sie im Speicher und man kann damit arbeiten. Ich persönlich würde mir `pandas` erst als Abhängigkeit ins Boot holen wenn man etwas mehr/anderes von dessen Funktionalität benötigt, was mit `numpy` nicht einfach machbar ist (Funktionen zum Einlesen von Daten gibt's da auch), aber wenn man die Abhängigkeit schon hat, kann man sie ja auch nutzen.

Die ``if``-Anweisung am Ende sorgt nur dafür dass die `main()`-Funktion nur ausgeführt wird wenn man das Modul als Programm ausführt und nicht wenn man es nur importiert.
Mertitare
User
Beiträge: 5
Registriert: Dienstag 3. November 2015, 12:57

@BlackJack Vielen, vielen Dank
Das nächste wäre nun das Maximum der y-Werte herauszufinden und diese im Graphen anzeigen zu lassen. Jedoch weiß ich da noch gar nicht wie man da rangeht
Falls jemand dafür Tipps hat gerne her damit ^^, in derzeit Recherchiere ich noch weiter ^^
PS: Mir fällt grad ein, dass ich die txt-Datei später gestellt bekomme, dort werden die Spalten mit Sicherheit anders heißen damit wäre der Zugriff dahin o.0
BlackJack

@Mertitare: Das Maximum einer Spalte eines `DataFrame` zu ermitteln ist einfach, da solltest Du aber wirklich mal die Grundlagen von Pandas durcharbeiten.

Wie man das im Graphen anzeigt hängt davon ab wie Du das anzeigen willst. Wobei man das doch eigentlich auch so sieht — der oberste Messpunkt halt.
Mertitare
User
Beiträge: 5
Registriert: Dienstag 3. November 2015, 12:57

@BlackJack Ja stimmt, da habe ich schneller getippt als ich nachgedacht habe ^^
Also das mit dem Anzeigen des Maximus und Minimums hab ich 1A hingekriegt.
Meine allerletzte Frage wäre: Wie kriegt man das hin ohne Kenntnisse der Spalten-Namen zu plotten ?
BlackJack

Die Namen der Spalten kann man über das `columns`-Attribut ermitteln oder man greift über das `values`-Attribut auf das Numpy-Array zu das hinter dem `DataFrame` steckt. Da kann man dann über die üblichen Numpy-Methoden auf die Spaltenwerte zugreifen. Also über „slicing“ oder in dem man das Array transformiert.
Antworten