Python Code Hilfe für Anfänger

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
Monochrom01
User
Beiträge: 1
Registriert: Freitag 30. Oktober 2020, 17:53

Moin liebe Forengemeinde,

Ich habe in der Uni ein bisschen C und Java Programmiert und mich nun privat angefangen mit Python auseinander zusetzen. Ganz frisch.

Wenn ich folgenden Code innerhalb meines Programms laufen lasse (CSV Lesen, in Zeilen aufteilen, diese Zeilen dann in einzelne Elemente aufteilen):

Code: Alles auswählen

## CSV Daten verarbeiten
dateiHandler = open('IBM_15min_30d.csv')
inhalt = dateiHandler.read()

tabelle = []
table = []

zeilen = inhalt.split('\n')

for i in range(len(zeilen)):
    spalten = zeilen[i].split(',')
    tabelle.append(spalten)

print(tabelle[3][4])

for element in range(len(tabelle)):
    table[element] = float(tabelle[element][4])
Sollte ich doch eine Tabelle "tabelle" haben, auf deren einzelnen Werte ich mit z.B. tabelle[3][4] zugereifen kann? ->Funktioniert auch im print() - Befehl in der dritt letzten Zeile :)
Allerdings versuche ich dann in der letzten beiden Zeilen nur die vierte Spalte der Tabelle von String in float zu konvertieren und in der neuen Liste Table zu speichern.
Dabei bekomme ich immer die Fehlermeldung:

table[element] = float(tabelle[element][4])
IndexError: list assignment index out of range

Diesen Fehler hab ich nun schon sehr oft produziert, ich denke ich hab da irgendwas nicht verstanden...

Oder kann mir jemand eine andere Möglichkeit nennen, mit der ich alle elemente von Tabelle, bis auf die erste Spalte, von String in float konvertieren kann?

Kann mir jemand Helfen?
Mfg Daniel
Benutzeravatar
__blackjack__
User
Beiträge: 14053
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Monochrom01: Offensichtlich hat `table` nicht die gleiche Länge wie `tabelle`. Das kann man schon alleine an den letzten beiden Zeilen und der Fehlermeldung erkennen. Wenn man dan den Rest des Codes anschaut, nämlich die Stelle wo `table` definiert wird und die Stelle(n) wo diese Liste dann mit Elementen gefüllt wird, sieht man auch schnell warum das so ist: `table` wird als leere Liste definiert, und das war es dann auch schon.

Sonstiges: Dateien die man öffnet sollte man auch wieder schliessen. Am einfachsten verwendet man dazu die ``with``-Anweisung.

Für CSV-Dateien gibt es ein Modul in der Standardbibliothek.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase).

`dateiHandler` ist ein komischer Name für ein Datei-Objekt. Was soll dieses „handler“ bedeuten?

``for i in range(len(sequence))`` ist in Python ein „anti pattern“. Man kann über die Elemente von `sequence` direkt itrieren, ohne den unnötigen Umweg über einen Index.

Bei der zweiten Schleife könntest Du vielleicht geneigt sein zu argumentieren, dass man da den Index für die Zuweisung braucht, aber auch das ist in Python unüblich das man Listen auf diese Art verändert. Man erstellt in der Regel einfach neue Listen mit den gewünschten Werten.

Um alle Elemente ausser dem ersten in einer Zeile in eine Gleitkommazahl zu wandeln würde man also für jede Zeilenliste eine neue Liste erstellen bei der das erste Element 1:1 übernommen wird, und alle weiteren in eine Gleitkommazahl gewandlet werden. Da braucht man eine Schleife. Auch wieder ohne Index, denn alle Elemente ausser dem ersten kann man per „slicing“ bekommen und darüber dann eine Schleife direkt über die Elemente schreiben. Man kann auch ohne explizite Schleife auskommen mit der `map()`-Funktion und dann Beispielsweise entweder `list()` und ``+`` oder noch kürzer durch „iterator unpacking“ innerhalb einer literalen Liste.

Edit: Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python3
import csv
from pprint import pprint


def main():
    with open("IBM_15min_30d.csv", encoding="utf-8", newline="") as datei:
        tabelle = [
            [head, *map(float, tail)] for head, *tail in csv.reader(datei)
        ]

    pprint(tabelle)
    print(tabelle[3][4])


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten