stream=True lar behandlingen starte før kroppen i et svar gjennom en proxy er lastet ned fullstendig. For CSV sender du en iterator over tekstlinjer til csv.reader, slik at skilletegn i anførselstegn og poster over flere linjer forblir CSV-data.

For en illustrerende UTF-8-fil med semikolon:

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

Velg filens faktiske koding og dialekt. For en offentlig CSV-nedlasting via en tillatt offentlig proxy-rute gir HTTP-proxy-listen kandidater til routes-URL-en. Denne versjonen normaliserer fysiske linjeslutt til LF: iter_lines fjerner dem, og generatoren legger til en ny linje for CSV-parseren. Det betyr noe når et felt i anførselstegn fortsetter på en annen fysisk linje.

For arbeidsflyter som krever byte-nøyaktig bevaring av innebygde CRLF-tegn, bruk en strømmende tekstinnpakning som bevarer disse linjesluttene. Den bevisste normaliseringen i eksempelet passer for postorientert behandling der LF er den tiltenkte representasjonen.

Én respons, mange lesninger

Iteratoren bruker biter fra én HTTP-respons. Den sender ikke en ny forespørsel for hver linje. HTTP Range-forespørsler er en annen mekanisme og identifiserer ikke CSV-postgrenser av seg selv.

Å kalle response.text eller samle alle rader i en liste ville hente hele innholdet tilbake i minnet. Strømming trenger fortsatt plass til transportbuffere og den gjeldende posten, som selv kan inneholde et stort felt.

Responskonteksten lukker kroppen når løkken avsluttes, også ved et tidlig treff. Lesetidsavbruddet begrenser ventingen på innkommende data, ikke den totale levetiden til en stor filoverføring.

Relaterte artikler