Pandas & NumPy Academy · Les

Lezen vanaf URL's en met StringIO

Laad externe CSV-bestanden rechtstreeks vanaf een URL en parse CSV-strings in het geheugen met io.StringIO voor tests.

Les 4 van 413 stappen

Lezen vanaf URL's en met StringIO is een gratis Pandas & NumPy Academy-les op CoddyKit. Dit is les 4 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject Pandas & NumPy Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.

Gegevens lezen zonder bestanden te downloaden

Je hoeft een bestand niet altijd op schijf op te slaan voordat je het in Pandas laadt. pd.read_csv(url) accepteert rechtstreeks een HTTP- of HTTPS-URL en downloadt het bestand in één stap naar een DataFrame. Dit is ideaal voor openbare gegevenssets op GitHub, data.gov of een webserver en maakt notebooks reproduceerbaar — iedereen kan ze uitvoeren zonder eerst bestanden te downloaden.

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))

Hoe URL's intern worden gelezen

Wanneer je een URL doorgeeft aan read_csv(), gebruikt Pandas intern Python's urllib of de bibliotheek requests om de onbewerkte bytes te downloaden en ontleedt het deze vervolgens precies alsof ze uit een lokaal bestand kwamen. De meeste leesfuncties (read_excel, read_json, read_parquet) ondersteunen URL's. Bestanden die zijn gecomprimeerd als .gz of .bz2 worden automatisch gedecomprimeerd.

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)

Requestheaders toevoegen voor verificatie

Sommige API's vereisen verificatieheaders (Bearer-tokens, API-sleutels). URL's lezen met Pandas ondersteunt geen aangepaste headers rechtstreeks. Gebruik in die gevallen requests om de inhoud eerst te downloaden en wikkel deze vervolgens in io.StringIO voordat je deze aan Pandas doorgeeft. Met dit patroon in twee stappen houd je HTTP-zaken gescheiden van het ontleden van gegevens.

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)

Wat is io.StringIO?

io.StringIO is een klasse uit de standaardbibliotheek van Python die vanuit een tekenreeks een bestandachtig object in het geheugen maakt. Omdat leesfuncties van Pandas een bestandspad of een bestandachtig object verwachten, kun je elke CSV-tekenreeks in StringIO wikkelen en deze rechtstreeks doorgeven. Dit is bijzonder nuttig voor tests, het verwerken van API-antwoorden en het ontleden van CSV-gegevens die dynamisch door Python-code zijn gegenereerd.

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 voor binaire gegevens

Gebruik voor binaire formaten zoals Excel, Parquet of gecomprimeerde CSV io.BytesIO (een buffer in het geheugen op basis van bytes) in plaats van io.StringIO. Wikkel de onbewerkte bytes uit een netwerkantwoord of een databaseveld van het type BLOB in BytesIO en geef deze door aan de juiste lezer. Zo voorkom je dat tijdelijke bestanden naar schijf worden geschreven.

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)

Testen met StringIO

Een belangrijk gebruik van StringIO is in unittests: neem kleine CSV-tekenreeksen rechtstreeks op in de testfunctie in plaats van fixturebestanden te gebruiken. Zo blijven tests zelfstandig, overdraagbaar en snel. De testgegevens worden samen met de code onder versiebeheer geplaatst en kunnen niet uit de pas lopen met een extern bestand.

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()

Naar StringIO schrijven voor CSV in het geheugen

Je kunt een DataFrame naar een StringIO-buffer schrijven met df.to_csv(buffer) om in het geheugen een CSV-tekenreeks te maken zonder een bestand te creëren. Roep buffer.getvalue() aan om de tekenreeks op te halen. Dit is nuttig om CSV in de hoofdtekst van een e-mail op te nemen, het in een HTTP-antwoord te verzenden of de verwachte en werkelijke CSV-uitvoer in tests te vergelijken.

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'

Externe gegevens cachen met Requests-Cache

Dezelfde URL tijdens de ontwikkeling herhaaldelijk downloaden is traag en verspilt bandbreedte. Gebruik requests-cache of sla de eerste download op in een lokaal bestand. Een veelgebruikt patroon is controleren of er een lokaal cachebestand bestaat en alleen terugvallen op de URL als dat niet het geval is. Zo verloopt de ontwikkeling snel en blijven notebooks uitvoerbaar vanaf het begin.

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)

Grote externe bestanden streamen

Combineer voor grote externe CSV-bestanden die niet in het geheugen passen streaming met requests en chunksize. Stream de inhoud van het antwoord regel voor regel naar een StringIO-buffer, lees blokken en verwerk deze stapsgewijs. Je kunt ook rechtstreeks met requests in blokken naar een lokaal bestand downloaden en vervolgens de blokgewijze leesfunctie van Pandas op de lokale kopie gebruiken.

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

Meerdere URL's parallel lezen

Wanneer je gegevenssets van meerdere URL's moet combineren, is ze na elkaar lezen traag. Gebruik Python's concurrent.futures.ThreadPoolExecutor om meerdere URL's gelijktijdig te downloaden en te ontleden en voeg de resultaten vervolgens samen met pd.concat(). Voor het ontleden van veel grote bestanden waarbij de processor de beperkende factor is, kan ProcessPoolExecutor sneller zijn.

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)

Beveiligingsoverwegingen voor externe URL's

Lezen vanaf niet-vertrouwde URL's brengt risico's met zich mee: een kwaadwillende server kan doorverwijzen naar een onverwacht formaat, een extreem groot bestand aanbieden waardoor het geheugen uitgeput raakt of inhoud injecteren die de ontleder in de war brengt. Controleer altijd het URL-schema (voor gevoelige gegevens moet dit HTTPS zijn), stel een time-out in voor de download en beperk het aantal rijen met nrows= wanneer je een onbekende URL voor het eerst onderzoekt.

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)

Korte controle

Test je begrip van het lezen vanaf URL's en het gebruik van StringIO uit deze les.

Samenvatting van de les

In deze les heb je geleerd dat pd.read_csv() HTTP-/HTTPS-URL's rechtstreeks accepteert zonder dat je bestanden eerst hoeft te downloaden, dat io.StringIO een CSV-tekenreeks inpakt als een bestandachtig object zodat Pandas deze vanuit het geheugen kan ontleden en dat io.BytesIO hetzelfde doet voor binaire formaten zoals Excel en Parquet. Hiermee is de cursus Gegevens lezen en schrijven voltooid — hierna filteren we DataFrames nauwkeurig met Booleaanse indexering en de methode query().

Gratis beginnen

Leer Python met een AI-tutor — gratis

Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.

Cursussen
30
Lessen
120

Veelgestelde vragen

Is de les “Lezen vanaf URL's en met StringIO” gratis?

Ja — de volledige tekst van “Lezen vanaf URL's en met StringIO” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus Pandas & NumPy Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus Pandas & NumPy Academy bevat in totaal 4 lessen.

Wat leer ik in “Lezen vanaf URL's en met StringIO”?

Laad externe CSV-bestanden rechtstreeks vanaf een URL en parse CSV-strings in het geheugen met io.StringIO voor tests. Je oefent met Pandas & NumPy Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.

Heb ik ervaring nodig om met Pandas & NumPy Academy te beginnen?

Ervaring vooraf is niet nodig. Pandas & NumPy Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 4 van 4.

Hoe lang duurt de les “Lezen vanaf URL's en met StringIO”?

De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.

Kan ik code schrijven en uitvoeren in deze les over Pandas & NumPy Academy?

Ja. Elke les over Pandas & NumPy Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.

Alle lessen in deze cursus

  1. CSV-bestanden lezen
  2. Excel- en JSON-bestanden lezen
  3. DataFrames naar bestanden schrijven
  4. Lezen vanaf URL's en met StringIO
← Terug naar Pandas & NumPy Academy