CSV Import

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
RIAIngo
User
Beiträge: 2
Registriert: Donnerstag 28. Mai 2020, 14:53

Hallo zusammen,

ich bin absoluter Neuling und scheitere schon an trivialen dingen.
Ich möchte ein Müllkalender Script umschreiben, dass nicht mehr über Web geparst sonder über eine lokale csv Datei

dies bedeutet, ich möchte gerne folgenden Code umbiegen:

Code: Alles auswählen

      j = requests.post(
                "http://api.abfall.io/?key=bd0c2d0177a0849a905cded5cb734a6f&modus=d6c5855a62cf32a4dadbc2831f0f295f&waction=export_csv", data=payload, timeout=10)

            apiRequest = j.text.split('\n')
            reader = csv.reader(apiRequest, delimiter=";")
            rowCounter = 0
            columns = None
            gelberSack = []
            restMuell = []
            papierTonne = []

            for row in reader:
                if rowCounter == 0:
                    columns = {k:row.index(k) for k in row}
                
                else:
                    if (row[columns["Gelber Sack"]] != ""):
                        gelberSack.append(datetime.strptime(row[columns["Gelber Sack"]], "%d.%m.%Y"))

                    if (row[columns["Restabfall"]] != ""):
                        restMuell.append(datetime.strptime(row[columns["Restabfall"]], "%d.%m.%Y"))

                    if (row[columns["Papiertonne"]] != ""):
                        papierTonne.append(datetime.strptime(row[columns["Papiertonne"]], "%d.%m.%Y"))

                rowCounter = rowCounter + 1
j soll nun auf eine lokale csv verweisen
die sieht so aus:

Code: Alles auswählen

Restabfall;Gelber Sack;Papiertonne;Hackgutabholdienst
08.01.2019;18.01.2019;22.01.2019;04.04.2019
22.01.2019;08.02.2019;19.02.2019;24.10.2019
05.02.2019;01.03.2019;19.03.2019;
19.02.2019;22.03.2019;15.04.2019;
05.03.2019;12.04.2019;14.05.2019;
19.03.2019;04.05.2019;11.06.2019;
02.04.2019;24.05.2019;09.07.2019;
15.04.2019;15.06.2019;06.08.2019;
30.04.2019;05.07.2019;03.09.2019;
14.05.2019;26.07.2019;30.09.2019;
28.05.2019;17.08.2019;28.10.2019;
12.06.2019;06.09.2019;26.11.2019;
25.06.2019;27.09.2019;19.12.2019;
09.07.2019;18.10.2019;;
23.07.2019;08.11.2019;;
06.08.2019;29.11.2019;;
20.08.2019;20.12.2019;;
03.09.2019;;;
17.09.2019;;;
01.10.2019;;;
15.10.2019;;;
29.10.2019;;;
12.11.2019;;;
26.11.2019;;;
10.12.2019;;;
23.12.2019;;;
vielen Dank für die Hilfe

Herzliche Grüße aus Ratingen
Ingo
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

Warum sollte "j" darauf verweisen? Abgesehen davon ist "j" ein denkbar schlechter Name für des Resultat eine Requests.

Schau mal in die Dokumentation des csv Moduls welche Parameter so ein Aufruf von .reader() akzeptiert.
Ein entsprechendes Beispiel findest du dort auch.
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Variablen werden in Python komplett klein geschrieben. Wenn man einen Zähler braucht, dann nimmt man enumerate und zählt nicht selbst, oder benutzt die index-Methode.
Aber da Du rowCounter sowieso nur brauchst, um die erste Zeile besonders zu behandeln, dann lies doch die erste Zeile vor der Schleife.
Die Klammern um die if-Bedingungen sind allesamt überflüssig.
Da Du mit gelber Sack, Restmüll und Papiertonne immer das gleiche machst, wäre eine Schleife und eine passende Datenstruktur besser.

Code: Alles auswählen

response = requests.post("http://api.abfall.io/?key=bd0c2d0177a0849a905cded5cb734a6f&modus=d6c5855a62cf32a4dadbc2831f0f295f&waction=export_csv", data=payload, timeout=10)
reader = csv.reader(StringIO(response.text), delimiter=";")
dates = {
    "Gelber Sack": [],
    "Restabfall": [],
    "Papiertonne": [],
}
columns = {k:i for i, k in enumerate(next(reader))}
for row in reader:
    for key, values in dates.items():
        data = row[columns[key]]
        if data:
            values.append(datetime.strptime(data, "%d.%m.%Y"))
Das kann aber ein DictReader besser:

Code: Alles auswählen

reader = csv.DictReader(StringIO(response.text), delimiter=";")
for row in reader:
    for key, values in dates.items():
        data = row[key]
        if data:
            values.append(datetime.strptime(data, "%d.%m.%Y"))
RIAIngo
User
Beiträge: 2
Registriert: Donnerstag 28. Mai 2020, 14:53

Hallo und erst mal vielen Dank für die schnellen Antworten.
Wie gesagt, der Parser ist geklaut und ich komme eher aus der VB Ecke daher möchte ich an dem funktionierenden Parser auch nicht rumfummeln.
Wenn ich den Link von Sparrow richtig interpretiere muss ich

Code: Alles auswählen

            j = requests.post(
                "http://api.abfall.io/?key=bd0c2d0177a0849a905cded5cb734a6f&modus=d6c5855a62cf32a4dadbc2831f0f295f&waction=export_csv", data=payload, timeout=10)

            apiRequest = j.text.split('\n')
            reader = csv.reader(apiRequest, delimiter=";")
ändern in

Code: Alles auswählen

            with open('muellkalender.csv', newline='') as csvfile:
            reader = csv.reader(csvfile, delimiter=";")
Antworten