Pandas & NumPy Academy · leksjon

Lese fra URL-er og StringIO

Last inn eksterne CSV-filer direkte fra en URL, og analyser CSV-strenger i minnet med io.StringIO for testing.

Leksjon 4 av 413 trinn

Lese fra URL-er og StringIO er en gratis leksjon i Pandas & NumPy Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Pandas & NumPy Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Pandas & NumPy Academy inneholder totalt 4 leksjoner.

Lese data uten å laste ned filer

De trenger ikke alltid å lagre en fil på disken før De laster den inn i Pandas. pd.read_csv(url) godtar en HTTP- eller HTTPS-URL direkte og laster ned filen til en DataFrame i ett trinn. Dette er ideelt for offentlige datasett på GitHub, data.gov eller en hvilken som helst webserver, og gjør notatbøker reproduserbare — alle kan kjøre dem uten å laste ned ressurser på forhånd.

import pandas as pd

url = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv'
df = pd.read_csv(url)
print(df.shape)   # (244, 7)
print(df.head(2))

Slik fungerer URL-lesing internt

Når De sender en URL til read_csv(), bruker Pandas Python-biblioteket urllib eller biblioteket requests internt til å laste ned råbyte, og tolker dem deretter på nøyaktig samme måte som om de kom fra en lokal fil. De fleste lesefunksjoner (read_excel, read_json, read_parquet) støtter URL-adresser. Filer som er komprimert som .gz eller .bz2, dekomprimeres automatisk.

import pandas as pd

# Compressed CSV from URL -- auto-decompressed
url = 'https://example.com/data.csv.gz'
df = pd.read_csv(url, compression='infer')
print(df.shape)

Legge til forespørselshoder for autentisering

Noen API-er krever autentiseringshoder (Bearer-tokener, API-nøkler). Pandas støtter ikke egendefinerte hoder direkte ved lesing fra URL-adresser. I slike tilfeller bruker De requests til å laste ned innholdet først, og pakker det deretter inn i io.StringIO før De sender det til Pandas. Dette totrinnsmønsteret skiller HTTP-håndtering fra datatolkning.

import pandas as pd
import requests
import io

headers = {'Authorization': 'Bearer mytoken123'}
response = requests.get('https://api.example.com/export.csv',
                        headers=headers)
df = pd.read_csv(io.StringIO(response.text))
print(df.shape)

Hva er io.StringIO?

io.StringIO er en klasse i Pythons standardbibliotek som oppretter et fillignende objekt i minnet fra en streng. Fordi Pandas-lesefunksjoner forventer enten en filbane eller et fillignende objekt, kan De pakke inn en hvilken som helst CSV-streng i StringIO og sende den direkte videre. Dette er svært nyttig ved testing, behandling av API-svar og tolking av CSV-data som genereres dynamisk av Python-kode.

import pandas as pd
import io

csv_text = 'name,score\nAlice,90\nBob,75\nCarol,88'
df = pd.read_csv(io.StringIO(csv_text))
print(df)
#     name  score
# 0  Alice     90
# 1    Bob     75
# 2  Carol     88

io.BytesIO for binærdata

For binærformater som Excel, Parquet eller komprimert CSV bruker De io.BytesIO (en minnebuffer basert på byte) i stedet for io.StringIO. Pakk råbytene fra et nettverkssvar eller et BLOB-felt i en database inn i BytesIO, og send det til den aktuelle lesefunksjonen. Dermed unngår De å skrive midlertidige filer til disken.

import pandas as pd
import requests
import io

# Download an Excel file without saving to disk
response = requests.get('https://example.com/report.xlsx')
buffer = io.BytesIO(response.content)
df = pd.read_excel(buffer, sheet_name='Data')
print(df.shape)

Teste med StringIO

En viktig bruk av StringIO er i enhetstester: legg små CSV-strenger direkte inn i testfunksjonen i stedet for å angi fixture-filer. Da blir testene selvstendige, portable og raske. Testdataene versjonskontrolleres sammen med koden og kan ikke komme ut av synkronisering med en ekstern fil.

import pandas as pd
import io

def test_clean_names():
    raw = 'name,age\n Alice ,30\nBob ,25'
    df = pd.read_csv(io.StringIO(raw))
    df['name'] = df['name'].str.strip()
    assert df['name'].tolist() == ['Alice', 'Bob']
    print('Test passed')

test_clean_names()

Skrive til StringIO for CSV i minnet

De kan skrive en DataFrame til en StringIO-buffer med df.to_csv(buffer) for å opprette en CSV-streng i minnet uten å lage en fil. Kall buffer.getvalue() for å hente strengen. Dette er nyttig når De skal bygge inn CSV i en e-posttekst, sende den i et HTTP-svar eller sammenligne forventet og faktisk CSV-resultat i tester.

import pandas as pd
import io

df = pd.DataFrame({'x': [1, 2], 'y': [3, 4]})
buffer = io.StringIO()
df.to_csv(buffer, index=False)
csv_string = buffer.getvalue()
print(repr(csv_string))
# 'x,y\n1,3\n2,4\n'

Bufre eksterne data med Requests-Cache

Det går sakte og bruker unødvendig båndbredde å laste ned den samme URL-adressen gjentatte ganger under utvikling. Bruk requests-cache, eller lagre den første nedlastingen i en lokal fil. Et vanlig mønster er å kontrollere om det finnes en lokal bufferfil, og bare bruke URL-adressen når filen mangler. Slik går utviklingen raskt, samtidig som notatbøkene fortsatt kan kjøres fra grunnen av.

import pandas as pd
import os

LOCAL = 'data/tips_cache.csv'
URL = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv'

if os.path.exists(LOCAL):
    df = pd.read_csv(LOCAL)
else:
    df = pd.read_csv(URL)
    df.to_csv(LOCAL, index=False)
print('Loaded:', df.shape)

Strømme store eksterne filer

For store eksterne CSV-filer som ikke får plass i minnet kan De kombinere strømming med requests og chunksize. Strøm innholdet i svaret linje for linje til en StringIO-buffer, les inn deler og behandle dem trinnvis. Alternativt kan De laste ned direkte med requests til en lokal fil i deler, og deretter bruke Pandas' delvise lesing på den lokale kopien.

import requests
import io
import pandas as pd

def stream_csv(url, chunksize=10000):
    with requests.get(url, stream=True) as r:
        content = r.content.decode('utf-8')
    for chunk in pd.read_csv(io.StringIO(content), chunksize=chunksize):
        yield chunk

Lese flere URL-adresser parallelt

Når De skal kombinere datasett fra flere URL-adresser, går det sakte å lese dem sekvensielt. Bruk Pythons concurrent.futures.ThreadPoolExecutor til å laste ned og tolke flere URL-adresser samtidig, og bruk deretter pd.concat() på resultatene. Ved CPU-bundet tolking av mange store filer kan ProcessPoolExecutor være raskere.

import pandas as pd
from concurrent.futures import ThreadPoolExecutor

urls = [
    'https://example.com/data_jan.csv',
    'https://example.com/data_feb.csv',
]

with ThreadPoolExecutor(max_workers=4) as ex:
    dfs = list(ex.map(pd.read_csv, urls))
combined = pd.concat(dfs, ignore_index=True)
print(combined.shape)

Sikkerhetshensyn ved eksterne URL-adresser

Det innebærer risiko å lese fra URL-adresser De ikke stoler på: En ondsinnet server kan omdirigere til et uventet format, levere en ekstremt stor fil som bruker opp minnet, eller sette inn innhold som forvirrer tolken. Valider alltid URL-skjemaet (det må være HTTPS for sensitive data), angi en tidsavbruddsgrense for nedlastingen, og begrens antallet rader med nrows= når De utforsker en ukjent URL-adresse for første gang.

import pandas as pd
import requests
import io

url = 'https://trusted-source.example.com/data.csv'
response = requests.get(url, timeout=30)  # 30-second timeout
response.raise_for_status()              # raise on HTTP error
df = pd.read_csv(io.StringIO(response.text), nrows=1000)
print(df.shape)

Hurtigsjekk

Test forståelsen Deres av lesing fra URL-adresser og StringIO i denne leksjonen.

Oppsummering av leksjonen

I denne leksjonen lærte De at: pd.read_csv() godtar HTTP-/HTTPS-URL-adresser direkte uten at filene må lastes ned først, io.StringIO pakker en CSV-streng inn i et fillignende objekt slik at Pandas kan tolke den fra minnet, og io.BytesIO gjør det samme for binærformater som Excel og Parquet. Dette avslutter kurset Reading and Writing Data — videre skal vi filtrere DataFrames presist ved hjelp av boolsk indeksering og metoden query().

Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
30
Leksjoner
120

Ofte stilte spørsmål

Er leksjonen «Lese fra URL-er og StringIO» gratis?

Ja – hele teksten i «Lese fra URL-er og StringIO» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Pandas & NumPy Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Pandas & NumPy Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Lese fra URL-er og StringIO»?

Last inn eksterne CSV-filer direkte fra en URL, og analyser CSV-strenger i minnet med io.StringIO for testing. Du øver på Pandas & NumPy Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Pandas & NumPy Academy?

Ingen tidligere erfaring er nødvendig. Pandas & NumPy Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.

Hvor lang tid tar leksjonen «Lese fra URL-er og StringIO»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Pandas & NumPy Academy-leksjonen?

Ja. Alle Pandas & NumPy Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Lese CSV-filer
  2. Lese Excel- og JSON-filer
  3. Skrive DataFrames til filer
  4. Lese fra URL-er og StringIO
← Tilbake til Pandas & NumPy Academy