Trasmettere in streaming record CSV su più righe con Python Requests e csv.reader
Trasmetti in streaming una risposta attraverso un proxy in csv.reader e preserva i confini dei record invece di dividere ogni riga fisica al delimitatore.
stream=True consente di iniziare l'elaborazione prima che il corpo di una risposta attraverso un proxy sia stato scaricato completamente. Per CSV, passa un iteratore di righe di testo a csv.reader in modo che i delimitatori tra virgolette e i record su più righe restino dati CSV.
Per un file UTF-8 illustrativo che usa punti e virgola:
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
Scegli la codifica e il dialetto effettivi del file. Per un download pubblico di CSV su una rotta proxy pubblica consentita, la lista di proxy HTTP fornisce candidati per l'URL routes. Questa versione normalizza i fine riga fisici in LF: iter_lines li rimuove e il generatore ne aggiunge uno nuovo per il parser CSV. Questo conta quando un campo tra virgolette continua su un'altra riga fisica.
Per flussi di lavoro che richiedono la conservazione byte per byte dei caratteri CRLF incorporati, usa una disposizione di wrapper testuale in streaming che preservi quei fine riga. La normalizzazione deliberata dell'esempio è adatta all'elaborazione orientata ai record in cui LF è la rappresentazione prevista.
Una risposta, molte letture
L'iteratore consuma blocchi da una singola risposta HTTP. Non emette una nuova richiesta per ogni riga. Le richieste HTTP Range sono un altro meccanismo e non identificano naturalmente i confini dei record CSV.
Chiamare response.text o raccogliere tutte le righe in un elenco riporterebbe l'intero contenuto in memoria. Lo streaming ha comunque bisogno di spazio per i buffer di trasporto e per il record corrente, che può esso stesso contenere un campo grande.
Il contesto della risposta chiude il corpo quando il ciclo termina, anche in caso di corrispondenza anticipata. Il timeout di lettura limita l'attesa dei dati in arrivo, non la durata totale di un trasferimento di file grande.