Seite 1 von 1

CSV Import

Verfasst: Donnerstag 28. Mai 2020, 15:09
von RIAIngo
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

Re: CSV Import

Verfasst: Donnerstag 28. Mai 2020, 18:11
von sparrow
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.

Re: CSV Import

Verfasst: Donnerstag 28. Mai 2020, 20:02
von Sirius3
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"))

Re: CSV Import

Verfasst: Freitag 29. Mai 2020, 08:52
von RIAIngo
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=";")