Zeilen aus einer csv - einzelne Strings raus holen

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
Podiphan
User
Beiträge: 4
Registriert: Mittwoch 20. September 2017, 08:42

Guten Morgen,

sitze grad an einem Programm in dem ich eine .csv einlesen muss. Anschließend bestimmte Strings raus holen und in einer Variable abspeichern. Habe es nun schon soweit gemacht das die Datei zumindest mal gelesen wird und über eine Schleife jede Zeile ausgibt. Die erste Zeile soll komplett gelöscht werden.
Es sind etwa 1440 Zeilen die alle vom Format so aussehen:

['056135242541;06.06.2017;"89490205430659900968";"";"Perkmer',
'Guenter";491735772964;"Telefonie";0863200001;"Grundpreise";010096224930;"Flat M ";;;"";01.03.2017;31.03.2017;19;200', '00;;;;']

!Nach Perkmer', ist noch eine Leerstelle!

Bräuchte da zum Beispiel die erste Nummer und den Namen auf jedenfall. Und die letzte Zahl. (200', '00) Müsste bei der Zahl aber die Hochkommata und die Leerstelle löschen, bevor ich es in eine Variable speicher. Alles können Strings sein.

Code bisher:
import sys, csv

with open('Rechnung_056133782541.csv', "r+") as inputFile:
csvReader = csv.reader(inputFile, dialect='excel')
for row in csvReader:
print(row)



Meine Frage ist nun:
Wie bekomme ich es hin, das die Vorschleife bestimmte Dinge aus jeder Zeile rauszieht? Das ganze müsste übertragbar sein auf andere .csv Datein, mit anderer Anzahl an Zeilen. Vielleicht in eine Dynamische Liste packen?

Grüße Podiphan! :D
Grüße Podiphan! :D
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Podiphan: Du bekommst von csv-Reader für jede Zeile eine Liste, die Du ganz normal, wie jede andere Liste benutzen kannst, also per Index-Zugriff.

Übrigens gibt es eine Dropbox "Code auswählen" über dem Forums-Eingabefeld, da wird Dein Code automatisch schön farbig und die Einrückungen bleiben auch bestehen.
Podiphan
User
Beiträge: 4
Registriert: Mittwoch 20. September 2017, 08:42

Guten Morgen,
Sirius3 hat geschrieben:Du bekommst von csv-Reader für jede Zeile eine Liste, die Du ganz normal, wie jede andere Liste benutzen kannst, also per Index-Zugriff..
Wie rufe ich dann andere Zeilen als die erste auf? Das ich mir die Objekte der ersten Zeile ausgebe, funktioniert. Nur hänge ich jetzt daran fest wie ich nun die zweite, dritte, usw. aufrufe. Am besten in einer Schleife alle nach einander. Da die .csv die ich habe 1440 Zeilen hat.

Code: Alles auswählen

import _csv
fileObj = _csv.reader(open('Rechnung_0561541.csv'),delimiter=";")
csvReader = fileObj

for i in csvReader:
    
    a = i[1]
    b = i[5]
    c = i[2]
    print (a,"\n", b,"\n", c)
Wichtig:
Ich bekomme außer der richtigen Ausgabe auch ein Error. Das wie folgt aussieht:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\sch\Desktop\Tebe\Python\test.py", line 31, in <module>
    a = i[1]
IndexError: list index out of range
Grüße Podiphan! :D
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Podiphan: Deine csv-Datei enthält offensichtlich leere Zeilen. Warum importierst Du _csv mit Unterstrich? Warum weist Du den reader erst den Namen `fileObj` zu, um ihn danach gleich auch `csvReader` zuzuweisen? Warum verwendest Du den Namen `i` für eine Zeile?
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Podiphan hat geschrieben: Ich bekomme außer der richtigen Ausgabe auch ein Error. Das wie folgt aussieht:

Code: Alles auswählen

Traceback (most recent call last):
  File "C:\Users\sch\Desktop\Tebe\Python\test.py", line 31, in <module>
    a = i[1]
IndexError: list index out of range
Gib einfach mal i aus. i ist kein Zähler, wie du offensichtlich annimmst, sondern die Zeile selber (und hat damit natürlich auch einen unpassenden Namen).
Podiphan
User
Beiträge: 4
Registriert: Mittwoch 20. September 2017, 08:42

Hallo,

danke für die schnelle Antwort.

Tatsächlich hat es als 2te Zeile und kurz vor Ende noch eine leere Zeile. Habe ich gerade durch rumprobieren gemerkt, das der Error deshalb erscheint.
Würde er mein Programm wegen des Errors abstürzen? Oder kann ich das Error einfach drin lassen?

Zu deinen deinen Fragen:
Warum importierst Du _csv mit Unterstrich?
Schlicht weg Gewöhnung von meinem PC zu hause, der irgendwie wohl ne ältere Version hat. Da muss ich tatsächlich den "_" nutzen.
Warum weist Du den reader erst den Namen `fileObj` zu, um ihn danach gleich auch `csvReader` zuzuweisen?

Habe ich mittlerweile abgeändert :roll:

Code: Alles auswählen

import csv

portfolio = csv.reader(open("Rechnung_05613363012541.csv", "r"), delimiter=';')
portfolio_list = []
portfolio_list.extend(portfolio)
names = []
for data in portfolio_list:
    names.append(data)

newlist=[]
for i in range(len(names)):
   t = (names[i])
   newlist.append(t)

for x in range(3, (len(newlist)):
    print(newlist[x][1], "\n", newlist[x][3], "\n", newlist[x][5], "\n")
    print(newlist[x][2], "\n", newlist[x][4], "\n", newlist[x][5], "\n")
Das ist mittlerweile mein Code. Noch erweitert. Mit "3" als Start, umgehe ich die erste Leerstelle. Da die zweite aber kurz vor ende ist, ich aber alle Zeilen nach der erstenLeerstelle brauche, gestaltet sich das schwer.
Warum verwendest Du den Namen `i` für eine Zeile?
Wohl auch gewöhnung. Ich seh meistens ein i in einer For-Schleife. Deshalb wohl automatisch "i" geschrieben. Das ist somit auch die Antwort für dich @/me
Grüße Podiphan! :D
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Podiphan: Du hast jetzt auf verschiedenste komplizierte Arten den `list`-Aufruf nachprogrammiert:

Code: Alles auswählen

portfolio_list = []
portfolio_list.extend(portfolio)
ist einfach `portfolio_list = list(portfolio)`, wobei Datentypen nicht in Variablennamen vorkommen sollten.

Code: Alles auswählen

names = []
for data in portfolio_list:
    names.append(data)
ist einfach `names = list(portfolio_list)`, wobei es mir nicht klar wird, warum Du nochmal eine Kopie der Liste brauchst.

Code: Alles auswählen

newlist=[]
for i in range(len(names)):
   t = (names[i])
   newlist.append(t)
ist einfach `newlist = list(names)`, wobei schon wieder eine unnötige Kopie erzeugt wird. Das `for i in range(len(...))` ist übrigens immer zu vermeiden, weil man direkt über die Elemente einer Liste iterieren kann, wie Du in der Liste-Kopie davor schon gezeigt hast.

Was also überigbleibt ist:

Code: Alles auswählen

import csv

portfolios = list(csv.reader(open("Rechnung_05613363012541.csv", "r"), delimiter=';'))

for portfolio in portfolios[3:]:
    for index in [1,3,5,2,5]:
        print(portfolio[index])
    print()
Die Frage nach dem Fehler beantwortet sich wohl von selbst.
Podiphan
User
Beiträge: 4
Registriert: Mittwoch 20. September 2017, 08:42

Hallo,

Die Frage nach dem Fehler beantwortet sich wohl von selbst.
Eben nicht. Da dein Code für die Angabe der Zeilen genau das selbe Error hervorruft. Ich sagte doch, dass am kurz vor Schluss, noch einmal ein Error kommt, wegen einer zweiten Leerzeilen. [3: ] löst also gar nichts. Es geht genauso wie in meinem Code von 3 bis Ende. Die zweite Leerzeile nimmt er also wieder mit. Dafür brauch ich eine Lösung.

Die eigentlich wichtigste Frage:
Würde mein Programm wegen des Errors abstürzen? Oder kann ich das Error einfach drin lassen?
Dafür bräuchte ich ne Antwort und kein Genörgel an den Namen für meine Variablen. Und wenn ich das Ding "ndi6fura5das3hgnf" nenne, völlig egal.
Grüße Podiphan! :D
__deets__
User
Beiträge: 14529
Registriert: Mittwoch 14. Oktober 2015, 14:29

Namen von Variablen helfen beim Verstehen des Codes. Zb wenn Leute hier ihn lesen & kommentieren sollen. Ist also mitnichten egal.

Aber eben diese Leute anzupaulen ist bestimmt auch ne gute Strategie :twisted:

Tut dein Programm was es soll? Nein. Damit ist deine Frage dann doch beantwortet, oder?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@Podiphan: Mein letzter Satz bezog sich genau auf Deine letzte Frage: "Würde mein Programm wegen des Errors abstürzen? Oder kann ich das Error einfach drin lassen?" Diese Fragen lassen sich einfach dadurch beantworten, dass man das Programm startet.

Hier im Forum wird Hilfe zur Selbshilfe gegeben. Du kannst nicht erwarten, komplett fertige Programme konstenfrei geliefert zu bekommen. Daneben mußt Du von anfang an lernen, sauber zu programmieren. Wenn man ein Programm in 5 statt in 15 Zeilen schreiben kann, dann kann sich ein Fehler auch nur in diesen 5 verstecken und ist somit viel einfacher zu finden. Das selbe gilt für gute Variablennamen, weil sie das Verstehen des Programms vereinfachen.

Wie würdest Du also mit dem Problem umgehen, dass manche Zeilen leer sind und es deshalb zu einem Fehler kommt?
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Dafür brauch ich eine Lösung.
Zwei mögliche Möglichkeiten:
1. _bevor_ du mit der Zeile irgendwas machst prüfen, ob diese überhaupt Inhalt hat oder eine leere Liste ist
2. Fehler mit `try... except NameDesFehlers` abfangen.

1. ist IMHO im gegebenen Fall der bessere Weg.
Dafür bräuchte ich ne Antwort und kein Genörgel an den Namen für meine Variablen.
Da wir, die dir helfen möchten, deinen Code zwangsläufig lesen und verstehen müssen, ist das definitiv _nicht_ egal, wie die Variablen benannt sind.
Und wenn ich das Ding "ndi6fura5das3hgnf" nenne, völlig egal.
Wenn du keinerlei Anspruch an die Qualität deines eigenen Codes hast -> ja, dann kann man das machen...

Gruß, noisefloor
Antworten