stream=True permite începerea procesării înainte ca corpul unui răspuns prin proxy să fie descărcat complet. Pentru CSV, transmite un iterator de linii de text către csv.reader, astfel încât delimitatorii dintre ghilimele și înregistrările pe mai multe linii să rămână date CSV.

Pentru un fișier UTF-8 ilustrativ cu punct și virgulă:

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

Alege codificarea și dialectul reale ale fișierului. Pentru o descărcare publică de CSV printr-o rută de proxy public permisă, lista de proxy HTTP oferă candidați pentru URL-ul routes. Această versiune normalizează terminațiile fizice de linie la LF: iter_lines le elimină, iar generatorul adaugă înapoi o linie nouă pentru parserul CSV. Acest lucru contează când un câmp dintre ghilimele continuă pe o altă linie fizică.

Pentru fluxuri de lucru care necesită păstrarea exactă la nivel de octet a caracterelor CRLF încorporate, folosește un înveliș text în flux care păstrează acele terminații de linie. Normalizarea deliberată din exemplu se potrivește procesării orientate pe înregistrări unde LF este reprezentarea dorită.

Un răspuns, multe citiri

Iteratorul consumă fragmente dintr-un singur răspuns HTTP. Nu emite o cerere nouă pentru fiecare linie. Cererile HTTP Range sunt un alt mecanism și nu identifică în mod natural limitele înregistrărilor CSV.

Apelarea response.text sau colectarea tuturor rândurilor într-o listă ar aduce întregul conținut înapoi în memorie. Streamingul are totuși nevoie de spațiu pentru bufferele de transport și înregistrarea curentă, care poate conține ea însăși un câmp mare.

Contextul răspunsului închide corpul când bucla iese, inclusiv la o potrivire timpurie. Timeout-ul de citire limitează așteptarea datelor primite, nu durata totală a unui transfer de fișier mare.

Articole similare