Streamovanie viacriadkových CSV záznamov s Python Requests a csv.reader
Odovzdávajte odpoveď cez proxy do csv.reader a zachovajte hranice záznamov namiesto delenia každého fyzického riadku na oddeľovači.
stream=True umožňuje začať spracovanie skôr, než je telo odpovede cez proxy úplne stiahnuté. Pre CSV odovzdajte csv.readeru iterátor textových riadkov, aby oddeľovače v úvodzovkách a viacriadkové záznamy zostali dátami CSV.
Pre ilustratívny súbor UTF-8 so stredníkmi:
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
Zvoľte skutočné kódovanie a dialekt súboru. Pre verejné stiahnutie CSV cez povolenú trasu verejnej proxy ponúka zoznam HTTP proxy kandidátov pre URL routes. Táto verzia normalizuje fyzické konce riadkov na LF: iter_lines ich odstráni a generátor pridá nový riadok späť pre parser CSV. Záleží na tom, keď pole v úvodzovkách pokračuje na ďalšom fyzickom riadku.
Pre postupy vyžadujúce bajtovo presné zachovanie vložených znakov CRLF použite streamujúci textový obal, ktorý tieto konce riadkov zachová. Zámerná normalizácia v príklade sa hodí na spracovanie orientované na záznamy, kde je LF zamýšľanou reprezentáciou.
Jedna odpoveď, mnoho čítaní
Iterátor spotrebúva časti jednej HTTP odpovede. Nevydáva novú požiadavku pre každý riadok. Požiadavky HTTP Range sú iný mechanizmus a hranice záznamov CSV prirodzene neurčujú.
Volanie response.text alebo zhromaždenie všetkých riadkov do zoznamu by vrátilo celý obsah späť do pamäte. Streamovanie napriek tomu potrebuje miesto pre transportné buffery a aktuálny záznam, ktorý sám môže obsahovať veľké pole.
Kontext odpovede zavrie telo pri opustení slučky, vrátane skorého nálezu. Časový limit čítania obmedzuje čakanie na prichádzajúce dáta, nie celkovú dobu prenosu veľkého súboru.