stream=True permet que el processament comenci abans que el cos d'una resposta a través d'un servidor intermediari s'hagi baixat del tot. Per a CSV, passeu un iterador de línies de text a csv.reader perquè els delimitadors entre cometes i els registres de diverses línies continuïn sent dades CSV.

Per a un fitxer UTF-8 il·lustratiu que fa servir punts i coma:

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

Trieu la codificació i el dialecte reals del fitxer. Per a una baixada pública de CSV per una ruta de servidor intermediari públic permesa, la llista de servidors intermediaris HTTP ofereix candidats per a l'URL de routes. Aquesta versió normalitza els finals de línia físics a LF: iter_lines els elimina i el generador torna a afegir un salt de línia per al parser de CSV. Això importa quan un camp entre cometes continua en una altra línia física.

Per a fluxes de treball que requereixen preservar byte a byte els caràcters CRLF incrustats, feu servir un embolcall de text en transmissió que conservi aquests finals de línia. La normalització deliberada de l'exemple és adequada per al processament orientat a registres on LF és la representació prevista.

Una resposta, moltes lectures

L'iterador consumeix fragments d'una sola resposta HTTP. No emet una petició nova per a cada línia. Les peticions HTTP Range són un mecanisme diferent i no identifiquen naturalment les fronteres dels registres CSV.

Cridar response.text o recollir totes les files en una llista tornaria el contingut complet a la memòria. La transmissió encara necessita espai per als buffers de transport i el registre actual, que pot contenir ell mateix un camp gran.

El context de la resposta tanca el cos quan el bucle surt, incloent-hi una coincidència primerenca. El temps d'espera de lectura limita l'espera de dades entrants, no la vida total d'una transferència de fitxer gran.

Articles relacionats