CSV-records over meerdere regels streamen met Python Requests en csv.reader
Stream een antwoord via een proxy naar csv.reader en behoud recordgrenzen in plaats van elke fysieke regel bij het scheidingsteken te splitsen.
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.