stream=True leidžia pradėti apdorojimą anksčiau, nei per tarpinį serverį gaunamo atsakymo turinys bus visiškai atsisiųstas. CSV atveju perduokite teksto eilučių iteratorių csv.reader, kad skyrikliai kabutėse ir kelių eilučių įrašai liktų CSV duomenimis.

Iliustraciniam UTF-8 failui su kabliataškiais:

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

Pasirinkite tikrąją failo koduotę ir dialektą. Viešam CSV atsisiuntimui leidžiamu viešo tarpinio serverio maršrutu HTTP tarpinių serverių sąrašas siūlo kandidatus routes URL adresui. Ši versija normalizuoja fizines eilučių pabaigas į LF: iter_lines jas pašalina, o generatorius vėl prideda naują eilutę CSV analizatoriui. Tai svarbu, kai laukas kabutėse tęsiasi kitoje fizinėje eilutėje.

Darbo eigoms, kurioms reikia baitų tikslumu išsaugoti įterptus CRLF simbolius, naudokite srautinį teksto apvalkalą, kuris išsaugo tas eilučių pabaigas. Sąmoningas pavyzdžio normalizavimas tinka įrašams orientuotam apdorojimui, kai LF yra numatytas vaizdavimas.

Vienas atsakymas, daug skaitymų

Iteratorius naudoja vieno HTTP atsakymo dalis. Jis nesiunčia naujos užklausos kiekvienai eilutei. HTTP Range užklausos yra kitas mechanizmas ir natūraliai neatpažįsta CSV įrašų ribų.

response.text iškvietimas arba visų eilučių surinkimas į sąrašą grąžintų visą turinį atgal į atmintį. Srautiniam apdorojimui vis tiek reikia vietos transporto buferiams ir dabartiniam įrašui, kuris pats gali turėti didelį lauką.

Atsakymo kontekstas uždaro turinį, kai ciklas baigiasi, įskaitant ankstyvą atitikimą. Skaitymo skirtasis laikas riboja laukimą gaunamų duomenų, o ne bendrą didelio failo perdavimo trukmę.

Susiję straipsniai