Hallo liebes Forum,
ich bin gerade dabei meine ersten CSV Dateien zu bearbeiten. In einer .csv Datei sind mir verschiedene Frequenzen über der Strömungsgeschwindigkeit für unterschiedliche Durchmesser gegeben. Und ich soll den Verlauf davon darstellen.
Hier mein Ansatz:
import numpy as np
import csv
import os
import matplotlib.pyplot as plt
messdaten = open('vf.csv',newline = '')
inhalt= messdaten.read()
zeilen = inhalt.split('\n')
tabelle = []
for zeile in range(len(zeilen)):
spalten = zeilen[zeile].split(',')
tabelle.append(spalten)
tabelle[zeile][1:1]= [float(zahl) for zahl in tabelle[zeile][1:1]]
pass
# Plotten
durchmesser = [zeile[0] for zeile in tabelle]
frequenz = [zeile[1] for zeile in tabelle]
plt.scatter(durchmesser,frequenz)
plt.xlabel("Strömungsgeschwindigkeit")
plt.ylabel("Durchmesser in mm")
plt.title("Verlauf der Frequenzen über der Strömungsgeschwindigkeit")
Die Messreihe:
/Users/mr.s/Desktop/Messreihe foto.png
.csv Tabelle plotten
- __blackjack__
- User
- Beiträge: 14019
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@Dabudda: ``pass`` einfach so auf Modulebene stehen zu haben macht überhaupt keinen Sinn.
Das `newline`-Argument bei `open()` wird so für das `csv`-Modul benötigt. Und das sollte man hier auch verwenden. Oder eine entsprechende Funktion aus dem `numpy`-Modul. Im Moment werden `csv`, `os`, und `numpy` importiert, aber nicht verwendet.
Dateien die man öffnet, sollte man auch wieder schliessen. Bei Dateien/`open()` erreicht man das am einfachsten und sichersten in dem man die Datei mit der ``with``-Anweisung zusammen öffnet.
`zeilen` enthält die Zeilen, aber `zeile` enthält nicht *eine Zeile* sondern den *Index* einer Zeile. Das ist aber sowieso ein „anti pattern“ in Python über den Umweg über einen Laufindex auf Elemente von Sequenzen zuzugreifen wenn man direkt über die Elemente iterieren kann.
Das Aufsplitten in Zeilen und Spaltenwerte ist aber sowieso Aufgabe des `csv`-Moduls.
Du ersetzt Elemente in den Sublisten von `tabelle` die Zeichenketten waren, durch Zahlen. Das macht man eher nicht. Man baut da eine neue Datenstruktur mit den umgewandelten Daten auf.
Wobei das so auch gar nicht funktioniert, weil der Slice 1:1 ist immer leer, weil der die Länge 0 hat:
Du willst an der Stelle auch *beide* Werte in jeder Zeile umwandeln und nicht nur die Frequenz.
Ungetestet:
Das `newline`-Argument bei `open()` wird so für das `csv`-Modul benötigt. Und das sollte man hier auch verwenden. Oder eine entsprechende Funktion aus dem `numpy`-Modul. Im Moment werden `csv`, `os`, und `numpy` importiert, aber nicht verwendet.
Dateien die man öffnet, sollte man auch wieder schliessen. Bei Dateien/`open()` erreicht man das am einfachsten und sichersten in dem man die Datei mit der ``with``-Anweisung zusammen öffnet.
`zeilen` enthält die Zeilen, aber `zeile` enthält nicht *eine Zeile* sondern den *Index* einer Zeile. Das ist aber sowieso ein „anti pattern“ in Python über den Umweg über einen Laufindex auf Elemente von Sequenzen zuzugreifen wenn man direkt über die Elemente iterieren kann.
Das Aufsplitten in Zeilen und Spaltenwerte ist aber sowieso Aufgabe des `csv`-Moduls.
Du ersetzt Elemente in den Sublisten von `tabelle` die Zeichenketten waren, durch Zahlen. Das macht man eher nicht. Man baut da eine neue Datenstruktur mit den umgewandelten Daten auf.
Wobei das so auch gar nicht funktioniert, weil der Slice 1:1 ist immer leer, weil der die Länge 0 hat:
Code: Alles auswählen
In [79]: items
Out[79]: ['1', '2', '3']
In [80]: items[1:1]
Out[80]: []
Ungetestet:
Code: Alles auswählen
#!/usr/bin/env python3
import csv
import matplotlib.pyplot as plt
def main():
with open("vf.csv", encoding="ascii", newline="") as messdaten_datei:
tabelle = [
list(map(float, datensatz))
for datensatz in csv.reader(messdaten_datei)
]
durchmesser = [zeile[0] for zeile in tabelle]
frequenz = [zeile[1] for zeile in tabelle]
plt.scatter(durchmesser, frequenz)
plt.xlabel("Strömungsgeschwindigkeit")
plt.ylabel("Durchmesser in mm")
plt.title("Verlauf der Frequenzen über der Strömungsgeschwindigkeit")
plt.show()
if __name__ == "__main__":
main()
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
@__blackjack____blackjack__ hat geschrieben: Montag 5. Juli 2021, 15:43 @Dabudda: ``pass`` einfach so auf Modulebene stehen zu haben macht überhaupt keinen Sinn.
Das `newline`-Argument bei `open()` wird so für das `csv`-Modul benötigt. Und das sollte man hier auch verwenden. Oder eine entsprechende Funktion aus dem `numpy`-Modul. Im Moment werden `csv`, `os`, und `numpy` importiert, aber nicht verwendet.
Dateien die man öffnet, sollte man auch wieder schliessen. Bei Dateien/`open()` erreicht man das am einfachsten und sichersten in dem man die Datei mit der ``with``-Anweisung zusammen öffnet.
`zeilen` enthält die Zeilen, aber `zeile` enthält nicht *eine Zeile* sondern den *Index* einer Zeile. Das ist aber sowieso ein „anti pattern“ in Python über den Umweg über einen Laufindex auf Elemente von Sequenzen zuzugreifen wenn man direkt über die Elemente iterieren kann.
Das Aufsplitten in Zeilen und Spaltenwerte ist aber sowieso Aufgabe des `csv`-Moduls.
Du ersetzt Elemente in den Sublisten von `tabelle` die Zeichenketten waren, durch Zahlen. Das macht man eher nicht. Man baut da eine neue Datenstruktur mit den umgewandelten Daten auf.
Wobei das so auch gar nicht funktioniert, weil der Slice 1:1 ist immer leer, weil der die Länge 0 hat:Du willst an der Stelle auch *beide* Werte in jeder Zeile umwandeln und nicht nur die Frequenz.Code: Alles auswählen
In [79]: items Out[79]: ['1', '2', '3'] In [80]: items[1:1] Out[80]: []
Ungetestet:Code: Alles auswählen
#!/usr/bin/env python3 import csv import matplotlib.pyplot as plt def main(): with open("vf.csv", encoding="ascii", newline="") as messdaten_datei: tabelle = [ list(map(float, datensatz)) for datensatz in csv.reader(messdaten_datei) ] durchmesser = [zeile[0] for zeile in tabelle] frequenz = [zeile[1] for zeile in tabelle] plt.scatter(durchmesser, frequenz) plt.xlabel("Strömungsgeschwindigkeit") plt.ylabel("Durchmesser in mm") plt.title("Verlauf der Frequenzen über der Strömungsgeschwindigkeit") plt.show() if __name__ == "__main__": main()
Vielen lieben Dank für die Antwort und Hilfestellung, ich werde mich direkt mal wieder dran setzen !