Met stream=True kan de verwerking beginnen voordat de body van een antwoord via een proxy volledig is gedownload. Voor CSV geef je een iterator van tekstregels aan csv.reader, zodat scheidingstekens tussen aanhalingstekens en records over meerdere regels CSV-gegevens blijven.

Voor een illustratief UTF-8-bestand met puntkomma's:

import csv
import requests

routes = {'https': 'http://proxy.example:8080'}
with requests.get(
    'https://data.example/observations.csv',
    proxies=routes,
    stream=True,
    timeout=(5, 30),
) as response:
    response.raise_for_status()
    response.encoding = 'utf-8'
    lines = (
        line + '\n'
        for line in response.iter_lines(
            chunk_size=65536, decode_unicode=True)
    )
    for record in csv.reader(lines, delimiter=';'):
        if record and record[0] == 'wanted':
            print(record)
            break

Kies de werkelijke codering en het dialect van het bestand. Voor een openbare CSV-download via een toegestane openbare proxy-route biedt de HTTP-proxylijst kandidaten voor de routes-URL. Deze versie normaliseert fysieke regeleinden naar LF: iter_lines verwijdert ze en de generator voegt weer een nieuwe regel toe voor de CSV-parser. Dat maakt uit wanneer een veld tussen aanhalingstekens doorloopt op een andere fysieke regel.

Voor werkstromen die byte-exact behoud van ingebedde CRLF-tekens vereisen, gebruik je een streamende tekstomhulling die die regeleinden behoudt. De bewuste normalisatie in het voorbeeld past bij recordgerichte verwerking waarbij LF de bedoelde weergave is.

Eén antwoord, veel leesbewerkingen

De iterator verbruikt stukken van één HTTP-antwoord. Hij stuurt geen nieuw verzoek voor elke regel. HTTP Range-verzoeken zijn een ander mechanisme en herkennen niet vanzelf recordgrenzen van CSV.

Het aanroepen van response.text of het verzamelen van alle rijen in een lijst zou de volledige inhoud terug in het geheugen brengen. Streaming heeft nog steeds ruimte nodig voor transportbuffers en het huidige record, dat zelf een groot veld kan bevatten.

De antwoordcontext sluit de body wanneer de lus eindigt, ook bij een vroege treffer. De leestime-out begrenst het wachten op inkomende gegevens, niet de totale levensduur van een grote bestandsoverdracht.

Gerelateerde artikelen