Descàrrega i lectura de fitxers des d'una URL (urlib3)

Apart de obrir fitxers que ja tenim, ens interessa baixar-nos fitxers que tinguem en un altre servidor. Usarem la llibreria predefinida de Python urllib

Com que és una operació lenta i costosa, només els volem baixar si no ho hem fet encara. Podem controlar si tenim o no el fitxer amb el mòdul gestió del sistema operatiu que porta Pyhton, os.path (que és multiplataforma!)

El que hem fet prèviament és pujar a un repositori propi de Gitlab (amb Github funciona igual) un fitxer.

Aquest fitxer volum_conques_internes_de_Catalunya_2022_2024.csv és una versió filtrada del dataset més actiu de la Generalitat el 2024 en motiu de la sequera, ja que mostra dia a dia com de plens estan els pantans de Catalunya (les conques internes).

Consulta el web service del volum de les conques internes a Catalunya

Proveu el codi; que només llegeix les 30 primeres línies.

import os.path
from datetime import datetime
from urllib.request import urlretrieve

url = "https://gitlab.com/xtec/bio-pandas/-/raw/main/data/volum_conques_internes_de_Catalunya_2022_2024.csv"

data_formatejada = datetime.now().strftime('%d-%m-%Y')
csv_file = f"aigua_conques_internes_{data_formatejada}.csv"

def llegir_primers_30_linies(csv_file):
    try:
        with open(csv_file, mode='r', encoding='utf-8') as file:
            # Llegir les primeres 30 línies
            for i, line in enumerate(file):
                if i >= 30:
                    break
                print(line.strip())
    except FileNotFoundError:
        print(f"El fitxer {csv_file} no s'ha trobat.")
    except Exception as e:
        print(f"S'ha produït un error inesperat: {str(e)}")

# Descarregar el fitxer CSV si no existeix
if not os.path.isfile(csv_file):
    try:
        urlretrieve(url, csv_file)
        print(f"Fitxer {csv_file} descarregat correctament.")
    except Exception as e:
        print(f"No s'ha pogut descarregar el fitxer des de {url}: {str(e)}")

# Cridar la funció per llegir les primeres 30 línies del fitxer CSV
llegir_primers_30_linies(csv_file)

Descàrrega i lectura de fitxers avançada amb la llibreria requests.

La llibreria que hem vist ens soluciona la vida si tenim la sort que podem allotjar les dades en el nostre servidor (en el nostre cas un de Gitlab)

Però en altres ocasions hem de descarregar-nos dates que s'actualitzen sovint, en portals de dades obertes en els que hem de certificar que som persones que volen accedir a les dades per fer-ne un ús confiable.

Sense anar més lluny, per accedir dirèctament al web service original dels embassaments de Catalunya, que si intentem accedir directament al JSON ens retorna un error que no tenim un certificat vàlid.

ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED]
certificate verify failed: unable to get local issuer certificate (_ssl.c:997)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  (...)
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED]
certificate verify failed: unable to get local issuer certificate (_ssl.c:997)>

Per solucionar aquest problema, consultarem aquestes fonts i les provarem... (pendent)

Descarregar un fitxer

    resp = urllib3.request(
        "GET",
        "https://gitlab.com/xtec/python/data/-/raw/main/airline-fligth.zip?ref_type=heads",
        preload_content=False,
    )

    with open(filepath, "wb") as out:
        while True:
            data = resp.read(4096)
            if not data:
                break
            out.write(data)

    resp.release_conn()

TODO