stream=True umožňuje zahájit zpracování dříve, než je tělo odpovědi přes proxy zcela staženo. Pro CSV předejte csv.reader iterátor textových řádků, aby oddělovače v uvozovkách a víceřádkové záznamy zůstaly daty CSV.

Pro ilustrativní soubor UTF-8 se středníky:

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

Zvolte skutečné kódování a dialekt souboru. Pro veřejné stažení CSV přes povolenou trasu veřejné proxy nabízí seznam HTTP proxy kandidáty pro URL routes. Tato verze normalizuje fyzické konce řádků na LF: iter_lines je odstraní a generátor přidá nový řádek zpět pro parser CSV. Na tom záleží, když pole v uvozovkách pokračuje na dalším fyzickém řádku.

Pro postupy vyžadující bajtově přesné zachování vložených znaků CRLF použijte streamující textový obal, který tyto konce řádků zachová. Záměrná normalizace v příkladu se hodí pro zpracování orientované na záznamy, kde je LF zamýšlenou reprezentací.

Jedna odpověď, mnoho čtení

Iterátor spotřebovává části jedné HTTP odpovědi. Nevydává nový požadavek pro každý řádek. Požadavky HTTP Range jsou jiný mechanismus a hranice záznamů CSV přirozeně neurčují.

Volání response.text nebo shromáždění všech řádků do seznamu by vrátilo celý obsah zpět do paměti. Streamování přesto potřebuje místo pro přenosové buffery a aktuální záznam, který sám může obsahovat velké pole.

Kontext odpovědi zavře tělo při opuštění smyčky, včetně časné shody. Časový limit čtení omezuje čekání na příchozí data, nikoli celkovou dobu přenosu velkého souboru.

Související články