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!
Zeilen aus einer csv - einzelne Strings raus holen
@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.
Ü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.
Guten Morgen,
Wichtig:
Ich bekomme außer der richtigen Ausgabe auch ein Error. Das wie folgt aussieht:
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.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..
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)
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!
@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?
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 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
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:
Habe ich mittlerweile abgeändert
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.
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:
Schlicht weg Gewöhnung von meinem PC zu hause, der irgendwie wohl ne ältere Version hat. Da muss ich tatsächlich den "_" nutzen.Warum importierst Du _csv mit Unterstrich?
Warum weist Du den reader erst den Namen `fileObj` zu, um ihn danach gleich auch `csvReader` zuzuweisen?
Habe ich mittlerweile abgeändert
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")
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 @/meWarum verwendest Du den Namen `i` für eine Zeile?
Grüße Podiphan!
@Podiphan: Du hast jetzt auf verschiedenste komplizierte Arten den `list`-Aufruf nachprogrammiert:
ist einfach `portfolio_list = list(portfolio)`, wobei Datentypen nicht in Variablennamen vorkommen sollten.
ist einfach `names = list(portfolio_list)`, wobei es mir nicht klar wird, warum Du nochmal eine Kopie der Liste brauchst.
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:
Die Frage nach dem Fehler beantwortet sich wohl von selbst.
Code: Alles auswählen
portfolio_list = []
portfolio_list.extend(portfolio)
Code: Alles auswählen
names = []
for data in portfolio_list:
names.append(data)
Code: Alles auswählen
newlist=[]
for i in range(len(names)):
t = (names[i])
newlist.append(t)
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()
Hallo,
Die eigentlich wichtigste Frage:
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 Frage nach dem Fehler beantwortet sich wohl von selbst.
Die eigentlich wichtigste Frage:
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.Würde mein Programm wegen des Errors abstürzen? Oder kann ich das Error einfach drin lassen?
Grüße Podiphan!
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
Tut dein Programm was es soll? Nein. Damit ist deine Frage dann doch beantwortet, oder?
Aber eben diese Leute anzupaulen ist bestimmt auch ne gute Strategie
Tut dein Programm was es soll? Nein. Damit ist deine Frage dann doch beantwortet, oder?
@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?
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?
- noisefloor
- User
- Beiträge: 3856
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
Hallo,
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.
Gruß, noisefloor
Zwei mögliche Möglichkeiten:Dafür brauch ich eine Lösung.
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.
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.Dafür bräuchte ich ne Antwort und kein Genörgel an den Namen für meine Variablen.
Wenn du keinerlei Anspruch an die Qualität deines eigenen Codes hast -> ja, dann kann man das machen...Und wenn ich das Ding "ndi6fura5das3hgnf" nenne, völlig egal.
Gruß, noisefloor