A stream=True lehetővé teszi a feldolgozás elkezdését, mielőtt egy proxy-n át érkező válasz törzse teljesen letöltődne. CSV esetén adjon át egy szövegsor-iterátort a csv.readernek, hogy az idézőjelek közötti elválasztók és a többsoros rekordok CSV-adatok maradjanak.

Egy szemléltető, pontosvesszőt használó UTF-8 fájl esetén:

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álassza a fájl tényleges kódolását és dialektusát. Egy engedélyezett nyilvános proxy-útvonalon történő nyilvános CSV-letöltéshez a HTTP-proxy lista kínál jelölteket a routes URL-hez. Ez a változat a fizikai sorvégeket LF-re normalizálja: az iter_lines eltávolítja őket, a generátor pedig újra hozzáad egy sort a CSV-elemzőnek. Ez akkor számít, amikor egy idézőjelek közötti mező egy másik fizikai sorban folytatódik.

Azokhoz a munkafolyamatokhoz, amelyek a beágyazott CRLF-karakterek bájtra pontos megőrzését igénylik, használjon olyan streamelő szövegburkoló elrendezést, amely megőrzi ezeket a sorvégeket. A példa szándékos normalizálása a rekordorientált feldolgozáshoz illik, ahol az LF a kívánt reprezentáció.

Egy válasz, sok olvasás

Az iterátor egyetlen HTTP-válasz darabjait fogyasztja. Nem indít új kérést minden sorhoz. A HTTP Range kérések más mechanizmus, és önmagukban nem azonosítják a CSV-rekordok határait.

A response.text meghívása vagy az összes sor listába gyűjtése az egész tartalmat visszahozná a memóriába. A streamelésnek továbbra is helyre van szüksége az átviteli pufferekhez és az aktuális rekordhoz, amely maga is tartalmazhat nagy mezőt.

A válasz kontextusa bezárja a törzset, amikor a ciklus kilép, korai egyezés esetén is. Az olvasási időkorlát a beérkező adatokra való várakozást korlátozza, nem egy nagy fájlátvitel teljes élettartamát.

Kapcsolódó cikkek