stream=True let handsaminga starte før kroppen av eit svar gjennom ein proxy er lasta ned heilt. For CSV sender du ein iterator over tekstlinjer til csv.reader, slik at skiljeteikn i hermeteikn og postar over fleire linjer blir verande CSV-data.

For ei illustrerande UTF-8-fil med semikolon:

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

Vel den faktiske kodinga og dialekten til fila. For ei offentleg CSV-nedlasting via ei tillaten offentleg proxy-rute gir HTTP-proxy-lista kandidatar til routes-URL-en. Denne versjonen normaliserer fysiske linjeslutt til LF: iter_lines fjernar dei, og generatoren legg til ei ny linje for CSV-parsaren. Det betyr noko når eit felt i hermeteikn held fram på ei anna fysisk linje.

For arbeidsflytar som krev byte-nøyaktig bevaring av innbygde CRLF-teikn, bruk ei straumande tekstinnpakking som bevarer desse linjeslutta. Den medvite normaliseringa i dømet passar for postorientert handsaming der LF er den tiltenkte representasjonen.

Eitt svar, mange lesingar

Iteratoren brukar bitar frå eitt HTTP-svar. Han sender ikkje ein ny førespurnad for kvar linje. HTTP Range-førespurnader er ein annan mekanisme og identifiserer ikkje CSV-postgrenser av seg sjølv.

Å kalle response.text eller samle alle radene i ei liste ville hente heile innhaldet tilbake i minnet. Strauming treng framleis plass til transportbuffar og den gjeldande posten, som sjølv kan innehalde eit stort felt.

Svar-konteksten lukkar kroppen når løkka går ut, også ved eit tidleg treff. Lesetidsavbrotet avgrensar venting på innkommande data, ikkje den totale levetida til ein stor filoverføring.

Relaterte artiklar