stream=True lader behandlingen begynde, før kroppen af et svar gennem en proxy er hentet helt. Til CSV sendes en iterator over tekstlinjer til csv.reader, så afgrænsere i anførselstegn og poster over flere linjer forbliver CSV-data.

For en illustrativ UTF-8-fil med semikolonner:

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

Vælg filens faktiske kodning og dialekt. Til en offentlig CSV-download via en tilladt offentlig proxy-rute giver HTTP-proxy-listen kandidater til routes-URL'en. Denne version normaliserer fysiske linjeafslutninger til LF: iter_lines fjerner dem, og generatoren tilføjer en ny linje tilbage til CSV-parseren. Det betyder noget, når et felt i anførselstegn fortsætter på en anden fysisk linje.

Til arbejdsgange, der kræver byte-præcis bevarelse af indlejrede CRLF-tegn, brug en streamende tekstindpakning, der bevarer disse linjeafslutninger. Eksemplets bevidste normalisering passer til postorienteret behandling, hvor LF er den tilsigtede repræsentation.

Ét svar, mange læsninger

Iteratoren forbruger bidder fra ét HTTP-svar. Den udsteder ikke en ny anmodning for hver linje. HTTP Range-anmodninger er en anden mekanisme og identificerer ikke CSV-postgrænser af sig selv.

At kalde response.text eller samle alle rækker i en liste ville bringe hele indholdet tilbage i hukommelsen. Streaming kræver stadig plads til transportbuffere og den aktuelle post, som selv kan indeholde et stort felt.

Svar-konteksten lukker kroppen, når løkken forlades, også ved et tidligt match. Læsetimeouten begrænser ventetiden på indgående data, ikke den samlede levetid for en stor filoverførsel.

Relaterede artikler