Probleme bei Tab-getrennten Daten

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
sos
User
Beiträge: 3
Registriert: Dienstag 9. Dezember 2014, 14:13

Servus zusammen,

ich habe bei einem Projekt eine Datendatei ausgespuckt bekommen und versuche nun seit geraumer Zeit diese plotten zu lassen. Leider tue ich mir schwer bei der Definition der Definition der Datensatztrennung. Ich hab es schon mit delimiter versucht, das hat jedoch auch nicht so funktioniert wie erwünscht.

Mein Skript sieht bisher so aus:

Code: Alles auswählen

#!/usr/bin/python

import numpy as np
import matplotlib.pyplot as plt

with open("/temp/bsp.txt") as f:
    data = f.read()

data = data.split('\n')

x=[row.split(' ')[0] for row in data]
y=[row.split(' ')[1] for row in data]
z=[row.split(' ')[2] for row in data]

fig = plt.figure()

ax1 = fig.add_subplot(111)

ax1.set_title("Plot title...")    
ax1.set_xlabel('Zeit')
ax1.set_ylabel('Kraft')


ax1.plot(x,y, c='r', label='Diagramm')

leg = ax1.legend()

plt.show()
Die Daten sehen in etwa so aus:

Code: Alles auswählen

Zeit	Kraft	Dehnung
0,000	-0,000	-0,000
50,000	0,000	0,003
100,000	-0,001	0,004
(die Formatierung kommt hier nicht rüber, ist halt durch ein Tab getrennt)

Als Fehlermeldung bekomme ich "y=[row.split(' ')[1] for row in data]
IndexError: list index out of range"

Hat jemand einen Tipp für mich, wie ich ihn dazu bringe, die Daten der TXT sauber auszulesen?

Danke und Gruß

Martin
Zuletzt geändert von Anonymous am Dienstag 9. Dezember 2014, 15:57, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
BlackJack

@sos: Wenn die Daten durch Tabulatorzeichen getrennt sind, dann kann man sie nicht an Leerzeichen aufteilen. Im vorliegenden Fall könnte `split()` *ohne* ein Argument funktionieren.

Das Plotten von Zeichenketten-Werten könnte dann das nächste Problem werden. Du musst die Zeichenketten mit den Ziffern in Zahlen umwandeln.
garreth
User
Beiträge: 41
Registriert: Donnerstag 23. Oktober 2014, 12:04

Servus zusammen,

leider kann ich dir mit dem plot nicht helfen. Ich habe mir allerdings deine Textdatei nachgebaut und versucht diese vernünftig in drei Listen einzufügen. Hier mein Vorschlag: (Python 3)

Code: Alles auswählen

f = open('bsp.txt', 'r')

x = []
y = []
z = []

for line in f:
    line = line.rstrip('\n')
    data = line.split('\t')
    
    try:
        x.append(float(data[0].replace(',','.')))
        y.append(float(data[1].replace(',','.')))
        z.append(float(data[2].replace(',','.')))
    except ValueError:
        print('Keine gültigen Daten')

print(x,y,z)
sos
User
Beiträge: 3
Registriert: Dienstag 9. Dezember 2014, 14:13

aaah, weil python das "," durch einen "." ersetzt haben will, nicht wahr?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

ungetestet:

Code: Alles auswählen

import csv

with open("/temp/bsp.txt") as data_file:
    table = csv.reader(data_file, delimiter='\t')
    data = ((float(col.replace(',', '.')) for col in row) for row in table)
    xs, ys, zs = zip(*data)
In specifications, Murphy's Law supersedes Ohm's.
garreth
User
Beiträge: 41
Registriert: Donnerstag 23. Oktober 2014, 12:04

sos hat geschrieben:aaah, weil python das "," durch einen "." ersetzt haben will, nicht wahr?
Richtig, float Zahlen werden immer durch Punkte getrennt. Wenn du versuchst das mit Komma zu machen wird er dir immer einen "ValueError" schmeißen.
sos
User
Beiträge: 3
Registriert: Dienstag 9. Dezember 2014, 14:13

Perfekt, vielen Dank, da war ich jetzt ne ganze Ecke dran gehangen. Das Plotten funktioniert auch. Jetzt knabbere ich erst mal ein wenig an der richtigen Interpolation der Y-Achse und wenn ich daran scheitern sollte wende ich mich noch mal an euch wenn ich darf! Vielen Dank!
Antworten