Wetterdaten vom DWD

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
schenkd
User
Beiträge: 2
Registriert: Dienstag 3. Januar 2017, 12:22
Wohnort: Bonn
Kontaktdaten:

Hallo Community,

im Rahmen eines Projektes hab ich mal ein kleines script geschrieben.
Es soll automatisiert alle Stationsdaten vom FTP-Server des DWD (Climate Data Center) downloaden.
Im Anschluss kann man dann diese Daten in CSV oder JSON konvertieren.

Wieso?
Der DWD bietet keine API an wie z.B. RESTful
Wer die Daten braucht muss diese manuell vom FTP-Server downloaden.
Bei über 1000 Stationen kann das dauern...

An einer direkten SQL-Schnittstelle arbeite ich aktuell. Hat aber keine Prio -> kann also dauern. ;-)
https://github.com/schenkd/cdc

Eventuell kann ich somit jemanden etwas Arbeit ersparen.
Über Feedback freue ich mich auch.

Viele Grüße
David
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Wer die Daten braucht muss diese manuell vom FTP-Server downloaden. Bei über 1000 Stationen kann das dauern...
Ich habe mir den Code nur kurz angeschaut, aber IMHO könntest du die Downloads parallelisieren - entweder mit ´concurrent.futures` oder ganz hip über `asyncio`. Letzteres setzt aber min Python 3.4 voraus, ersteres funktioniert mit Python >= 3.2 und Python 2.7 (wenn man das `futures` Modul nachinstalliert).

Gruß, noisefloor
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@schenkd: ich hab mir mal den Code auf GitHub angeschaut.

Ein paar allgemeine Anmerkungen: Importe sollten immer am Anfang der Datei stehen, damit man auf einen Blick die Abhängigkeiten erkennen kann. Abkürzungen sollten vermieden werden, was tlb heißen soll, ist mir nicht ersichtlich. Deine Funktionen in »main.py« sind eigentlich nur Code-Abschnitte mit Namen. Wenn ich mir » generate_json« anschaue, werde ich aus dem Namend der Methode »file« nicht schlau. Ein Name sollte einen Anhaltspunkt bieten, was die Funktion denn macht, also insbesondere bei Funktionen eine Tätigkeit beschreiben. Benutze String-Formatierung statt Strings mit + zusammenzustückeln. »app« ist ein viel zu generischer Name für ein Paket; »main.py« ein viel zu generischer Name für ein Programm.
Um Pfade zusammenzubauen benutzt man »os.path.join« (z.B. in config.py). Wenn »APP_PATH« sowieso das aktuelle Verzeichnis sein soll, dann schreib doch einfach "./"

»FileHandler« ist wieder ein viel zu generischer Name, da Du ja anscheinend ein bestimmtes Dateiformat im Sinn hast. Ein File-Objekt in Python ist gleich in Iterator über seine Zeilen. Headerzeilen liest man über »headerline = next(file).split()» (was soll eigentlich der Plural?), das spart den umständlichen Zeilenindexvergleich in der for-Schleife. Warum wird in »stations« das Encoding hart verdrahtet, in »meta« aber über ein Attribut gelesen? Die Rückgabewerte sollten Tuple und keine Listen sein. Insgesamt ist das für mich keine Klasse, das sollten Funktionen sein. Die Klassen von get_csv und get_json sind eigentlich auch unnötig und sollten durch Funktionen ersetzt werden. Über die Namensgebung und das Pfad-Zusammenstückeln habe ich ja schon oben geschrieben. Die Modulnamen sind seltsam. Was wird da geholt? In get_ftp hast Du kopierten Code in download und download_unpack, das Herunterladen sollte auf einer Funktion aufbauen. get_log: GeneratorLog ist eigentlich keine Klasse, sondern eine Funktion, die einen Logger konfiguriert. Der Modulname ist seltsam. ImportSQL ist eigentlich keine Klasse. Das Modul _mysql ist eigentlich nicht zum Arbeiten gedacht, das sieht man schon am Unterstrich. Was soll eigentlich dieses isinstance? Kennt die mySQL-Anbindung eigentlich kein with? Bei connect ist ein schwerer Designfehler: Fehler sollten nach oben weitergereicht werden, bis jemand was sinnvolles damit anfangen kann und nicht im Fehlerfall ein anderer Datentyp zurückgegeben werden.

Die Hilfmethoden in toolbox sind allesamt etwas komisch. Funktionen die exists_* heißen sollten eigentlich nur die Existenz prüfen und nicht Dinge erstellen. »unzipfiles« macht auch nicht das, was der Name behauptet, dazu ist der viel zu generisch. Fehler einfach so zu ignorieren, wenn man Dateien löscht, ist ein bißchen gefährlich.


Überleg Dir, wann es wirklich sinnvoll ist, Klassen zu benutzen. Klassen sind kein Selbstzweck. Schau Dir nochmal an, wie man mit Dateien arbeitet und überlege Dir bessere Namen. Wenn man sie liest, sollte man wissen, wozu die Variable oder Funktion gut ist und keine Überraschungen erleben.
Antworten