Transmitir rexistros CSV de varias liñas con Python Requests e csv.reader
Transmita unha resposta a través dun proxy cara a csv.reader e conserve os límites dos rexistros en vez de dividir cada liña física polo delimitador.
stream=True permite que o procesamento comece antes de que o corpo dunha resposta a través dun proxy se descargue por completo. Para CSV, pase un iterador de liñas de texto a csv.reader para que os delimitadores entre comiñas e os rexistros de varias liñas sigan sendo datos CSV.
Para un ficheiro UTF-8 ilustrativo con puntos e 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
Escolla a codificación e o dialecto reais do ficheiro. Para unha descarga pública de CSV por unha ruta de proxy público permitida, a lista de proxies HTTP ofrece candidatos para o URL de routes. Esta versión normaliza os finais de liña físicos a LF: iter_lines elimínaos e o xerador volve engadir un salto de liña para o analizador CSV. Iso importa cando un campo entre comiñas continúa noutra liña física.
Para fluxos de traballo que requiren conservar byte a byte os caracteres CRLF incorporados, use un envoltorio de texto en fluxo que preserve eses finais de liña. A normalización deliberada do exemplo encaixa co procesamento orientado a rexistros onde LF é a representación prevista.
Unha resposta, moitas lecturas
O iterador consome fragmentos dunha soa resposta HTTP. Non emite unha petición nova por cada liña. As peticións HTTP Range son outro mecanismo e non identifican por si mesmas os límites dos rexistros CSV.
Chamar a response.text ou reunir todas as filas nunha lista traería todo o contido de volta á memoria. A transmisión aínda necesita espazo para os buffers de transporte e o rexistro actual, que pode conter el mesmo un campo grande.
O contexto da resposta pecha o corpo ao saír do bucle, incluíndo unha coincidencia temperá. O tempo de espera de lectura limita a espera de datos entrantes, non a vida total dunha transferencia de ficheiro grande.