CSV mit unterschiedlichen Zellenanzahl pro Spalte

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
EW1967
User
Beiträge: 1
Registriert: Montag 9. März 2020, 16:50

Hallo Python-Forum,

ich bin neu und Anfänger!

eine csv in folgender Form in ein TableWidget einlesen
a,b,c,d
d,s,a,f
w,e,t,r
usw. klappt so weit :-)

self.ui.tW_daten.setRowCount(0)
with open('Header.csv', "r", newline='') as file:
reader = csv.reader(file, delimiter=',', quotechar='|')
for line in reader:
row = self.ui.tW_daten.rowCount()
self.ui.tW_daten.insertRow(row)
self.ui.tW_daten.setItem(row, 0, QtWidgets.QTableWidgetItem(line[0]))
self.ui.tW_daten.setItem(row, 1, QtWidgets.QTableWidgetItem(line[1]))
self.ui.tW_daten.setItem(row, 2, QtWidgets.QTableWidgetItem(line[2]))
self.ui.tW_daten.setItem(row, 3, QtWidgets.QTableWidgetItem(line[3]))


aber wie lese ich folgende csv ein
a,b,c
a,b,c,d,e
a,b
a,b,c,d,e,f,g

hier bekomme ich die Fehlermeldung :
Traceback (most recent call last):
File "C:/Start.py", line 86, in readCsvFile
self.ui.tW_daten.setItem(row, 26, QtWidgets.QTableWidgetItem(line[26]))
IndexError: list index out of range

Ich danke jedem der mir hilft!!
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Bitte gewöhne dir gleich sprechende Namen für Variablen an, die auch das aussagen, was sie sind. "row" beinhaltet keine "Reihe" sondern die "Zeilennummer".
Den Fehler umgehst du, indem du vorher prüfst, ob "line" auch genug Elemente hat. Wenn es nur 2 hat, kannst du nicht auf das 3. zugreifen.
Eigentlich willst du aber eine Schleife.

Und poste Code hier bitte in Code-Tags damit die Einrückung erhalten bleibt. Die werden automatisch eingefügt, wenn du auf "Vollständiger Editor & Vorschau" klickst und dort "</>" drückst.

Eingerückt wird in Python nach Konvention immer mit 4 Leerzeichen. Keine Tabs oder eine andere Anzahl von Leerzeichen.

ungetestet:

Code: Alles auswählen

self.ui.tW_daten.setRowCount(0)
with open('Header.csv', "r", newline='') as file:
    reader = csv.reader(file, delimiter=',', quotechar='|')
    for line in reader:
        row_number = self.ui.tW_daten.rowCount()
        self.ui.tW_daten.insertRow(row_number)
        for column_number, value in enumerate(line):
            self.ui.tW_daten.setItem(row_number, column_number, QtWidgets.QTableWidgetItem(value))
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

`line` würde ich dann noch `row` nennen, weil `line` eine Textzeile ist und man da eher keine Liste mit Datensatzwerten erwartet. Der Name `row` ist ja jetzt verfügbar. :-)
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten