Neuste Datei von GitHub herunterladen

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
Pythonboy
User
Beiträge: 11
Registriert: Freitag 27. März 2020, 11:57

Hey,

wie kann ich die neuste .csv Datei von diesem Link herunterladen? Entschuldigung falls das keine Python Frage ist aber ich kenne mich mit GitHub nicht aus :/

https://github.com/CSSEGISandData/COVID ... ly_reports
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du clonst das repository mit git einmal, und rufst jeden Tag 'git pull' auf, und dann hast du die neueste Datei und musst die nur der Namenskonvention entsprechend raussuchen.
Pythonboy
User
Beiträge: 11
Registriert: Freitag 27. März 2020, 11:57

Danke.
Habe die CSV Datei jetzt heruntergeladen und in ein DataFrame eingelesen.

Code: Alles auswählen

          Country_Region  Confirmed  Deaths  Recovered  Active
0                     US          3       0          0       0
1                     US          3       0          0       0
2                     US          2       0          0       0
3                     US         39       0          0       0
4                     US          1       0          0       0
...                  ...        ...     ...        ...     ...
3416           Venezuela        107       0         15      92
3417             Vietnam        153       0         20     133
3418  West Bank and Gaza         84       1         17      66
3419              Zambia         16       0          0      16
3420            Zimbabwe          3       1          0       2
Ich möchte nun die Werte für Confirmed, Deaths, Recovered und Active zusammenaddieren, wenn in der Spalte Country_Region das gleiche Land steht. Habe das so versucht aber es klappt nicht.

Code: Alles auswählen

    df = pd.read_csv(FILENAME, usecols= ["Country_Region", "Confirmed", "Deaths", "Recovered", "Active"])
    for column in df.columns.values:
        df.groupby("Country_Region")[column].sum()  
    print(df)
Hat jemand einen Tipp?
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was klappt daran denn nicht? Und warum hast Du da eine Schleife über die Spaltennamen?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
JakobDev
User
Beiträge: 63
Registriert: Mittwoch 17. Juli 2019, 17:20

Ich habe mal einen Code geschrieben, der das ganze auch ohne die Hilfe von git herunterlädt:

Code: Alles auswählen

from datetime import datetime
import requests

datelist = []
response = requests.get("https://api.github.com/repos/CSSEGISandData/COVID-19/contents/csse_covid_19_data/csse_covid_19_daily_reports").json()

for i in response:
    if i["name"].endswith(".csv"):
        datelist.append(datetime.strptime(i["name"][:-4],"%m-%d-%Y"))

newest_date = max(datelist)

newest_filename = "%s-%s-%s.csv" % ("{:02d}".format(newest_date.month), "{:02d}".format(newest_date.day), newest_date.year)

csv_data = requests.get("https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/" + newest_filename)

with open("downloaded_data.csv","w",encoding="utf-8") as f:
    f.write(csv_data.text)
Ist einfacher, als git zu benutzen.
Pythonboy
User
Beiträge: 11
Registriert: Freitag 27. März 2020, 11:57

Danke, habe mir aber auch was eigenes gebaut was ich benutze bis ich das mit Git hinbekomme. :)

Code: Alles auswählen

import urllib.request
from datetime import datetime, timedelta


BASE_URL = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_daily_reports/"
FILENAME = "Corona.csv"

def get_latest_csv():
    try:
        date_today = datetime.strftime(datetime.now(), '%m-%d-%Y')
        csv_url = f"{BASE_URL}{date_today}.csv"
        urllib.request.urlretrieve(csv_url, FILENAME)
        found_csv = True
    except urllib.error.HTTPError:
        print(f"Die Datei vom {date_today} wurde nicht gefunden.\nEs wird die Datei vom Vortag gesucht.")
        found_csv = False
    if not found_csv:
        try:
            date_yesterday = datetime.strftime(datetime.now() - timedelta(1), '%m-%d-%Y')
            csv_url = f"{BASE_URL}{date_yesterday}.csv"
            urllib.request.urlretrieve(csv_url, FILENAME)
            print(f"Datei vom {date_yesterday} gefunden!")
        except urllib.error.HTTPError:
            print("Keine Daten gefunden")
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@JakobDev: Grunddatentypen haben in Namen nichts zu suchen.

Man sollte keine Daten im Code wiederholen. Das ist fehleranfällig sowohl beim schreiben, also auch wenn man das mal anpassen möchte. Wobei man die zweite URL in dem Code eigentlich gar nicht braucht, denn die Download-URLs sind in der Antwort der ersten Anfrage mit enthalten.

`i` ist kein guter Name für ein Wörterbuch das Daten zu einer Datei im Repository enthät.

`newest_filename` wird ziemlich umständlich zusammengesetzt. Erst einmal werden da ``%`` und `format()` gemischt wo man doch einfach direkt `format()` für alles verwenden könnte. Und dann kann man gleich das Datum als einen Wert entsprechend formatieren, statt Monat, Tag, und Jahr einzeln.

Code: Alles auswählen

    newest_filename = "%s-%s-%s.csv" % (
        "{:02d}".format(newest_date.month),
        "{:02d}".format(newest_date.day),
        newest_date.year,
    )

    # <=>
    
    newest_filename = "{:02d}-{:02d}-{:04d}.csv".format(
        newest_date.month, newest_date.day, newest_date.year
    )
    
    # <=>
    
    newest_filename = "{:%m-%d-%Y}.csv".format(newest_date)
Aber wie gesagt, die Download-URL ist schon in den Daten der ersten Abfrage enthalten, die muss man sich nicht selbst noch mal zusammenbasteln.

`csv_data` ist mehr als nur die Daten, da ist eine komplette Serverantwort mit Headern enthalten. Und CSV-Daten nur wenn die Abfrage erfolgreich war.

Überarbeitet:

Code: Alles auswählen

#!/usr/bin/env python3
from datetime import datetime as DateTime
from pathlib import Path

import requests

GITHUB_API_URL = (
    "https://api.github.com/repos/CSSEGISandData/COVID-19/contents/"
    "csse_covid_19_data/csse_covid_19_daily_reports"
)


def main():
    response = requests.get(GITHUB_API_URL)
    response.raise_for_status()
    extension = ".csv"
    newest_file = max(
        (file for file in response.json() if file["name"].endswith(extension)),
        key=lambda file: DateTime.strptime(
            file["name"][: -len(extension)], "%m-%d-%Y"
        ),
    )

    response = requests.get(newest_file["download_url"])
    response.raise_for_status()
    Path("downloaded_data.csv").write_text(response.text, encoding="utf-8")


if __name__ == "__main__":
    main()
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Pythonboy: Methoden sollte man auf den Objekten aufrufen und nicht auf der Klasse und das Objekt übergeben.

Wobei `strftime()` aber auch gar nicht notwendig ist, weil man das im Platzhalter bei der Formatierung erledigen kann. Da würde ich bei den Variablen dann auch `datetime.date`-Objekt behalten und bei den Ausgaben für den Benutzer nicht dieses unsägliche amerikanische Datumsformat verwenden.

`found_csv` macht das Programm unnötig umständlicher, das würde ich weg lassen.

In den beiden Fällen gibt es sehr ähnlichen Code den man in einer Funktion heraus ziehen sollte um Code-/Datenwiederholungen zu vermeiden.

Das aktuelle Datum sollte man nur einmal ermitteln, sonst kann es komisch werden wenn das Datum das erste mal *vor* Mitternacht und das zweite mal *nach* Mitternacht ermittelt wird, weil dann effektiv zweimal das selbe Datum versucht wird.

Das in den ausgegebenen Texten mit „gesucht“ und „gefunden“ ist ein bisschen irreführend, denn da wird nichts gesucht, sondern es wird versucht herunterzuladen. Und „nicht gefunden“ ist ja bei weitem nicht der einzige Grund warum das herunterladen nicht funktioniert haben könnte und auch Protokollfehler sind nicht die einzigen Gründe. Die Fehlerbehandlung ist so nicht wirklich sinnvoll und unvollständig.

Zwischenstand:

Code: Alles auswählen

import urllib.request
from datetime import date as Date, timedelta as TimeDelta


BASE_URL = (
    "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/"
    "csse_covid_19_data/csse_covid_19_daily_reports/"
)
FILENAME = "Corona.csv"


def retrieve_csv_file(date):
    urllib.request.urlretrieve(f"{BASE_URL}{date:%m-%d-%Y}.csv", FILENAME)


def get_latest_csv():
    #
    # FIXME Exception handling isn't complete and output not very helpful to
    # find the source of the problem.
    #
    today = Date.today()
    try:
        retrieve_csv_file(today)
    except urllib.error.HTTPError:
        print(
            f"Die Datei vom {today} konnte nicht heruntergeladen werden.\n"
            f"Es wird die Datei vom Vortag heruntergeladen."
        )
        yesterday = today - TimeDelta(1)
        try:
            retrieve_csv_file(yesterday)
        except urllib.error.HTTPError:
            print("Datei konnte nicht heruntergeladen werden.")
        else:
            print(f"Datei vom {yesterday} heruntergeladen!")
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten