stream=True mahdollistaa käsittelyn aloittamisen ennen kuin välityspalvelimen kautta tulevan vastauksen runko on ladattu kokonaan. CSV:tä varten välitä tekstirivien iteraattori csv.readerille, jotta lainausmerkkien sisäiset erottimet ja moniriviset tietueet pysyvät CSV-datana.

Esimerkinomaiselle UTF-8-tiedostolle, joka käyttää puolipisteitä:

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

Valitse tiedoston todellinen koodaus ja murre. Julkiseen CSV-lataukseen sallitulla julkisella välityspalvelinreitillä HTTP-välityspalvelinluettelo tarjoaa ehdokkaita routes-URL-osoitteelle. Tämä versio normalisoi fyysiset rivinvaihdot LF:ksi: iter_lines poistaa ne ja generaattori lisää rivinvaihdon takaisin CSV-jäsentäjää varten. Tällä on merkitystä, kun lainausmerkeissä oleva kenttä jatkuu toiselle fyysiselle riville.

Työnkuluille, jotka vaativat upotettujen CRLF-merkkien tavutarkan säilytyksen, käytä suoratoistavaa tekstikäärettä, joka säilyttää nuo rivinvaihdot. Esimerkin tarkoituksellinen normalisointi sopii tietuekeskeiseen käsittelyyn, jossa LF on aiottu esitysmuoto.

Yksi vastaus, monta lukukertaa

Iteraattori kuluttaa yhden HTTP-vastauksen paloja. Se ei lähetä uutta pyyntöä jokaista riviä varten. HTTP Range -pyynnöt ovat eri mekanismi eivätkä ne luonnostaan tunnista CSV-tietueiden rajoja.

response.textin kutsuminen tai kaikkien rivien kerääminen listaan toisi koko sisällön takaisin muistiin. Suoratoisto tarvitsee silti tilaa siirtopuskureille ja nykyiselle tietueelle, joka voi itsessään sisältää suuren kentän.

Vastauksen konteksti sulkee rungon, kun silmukasta poistutaan, myös varhaisessa osumassa. Lukuaikakatkaisu rajoittaa saapuvien tietojen odottamista, ei suuren tiedostonsiirron kokonaiskestoa.

Aiheeseen liittyvät artikkelit