Transmeteu registres CSV de diverses línies amb Python Requests i csv.reader
Transmeteu una resposta a través d'un servidor intermediari a csv.reader i preserveu les fronteres dels registres en lloc de dividir cada línia física pel delimitador.
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.