stream=True permite que el procesamiento empiece antes de que el cuerpo de una respuesta a través de un proxy se haya descargado por completo. Para CSV, pase un iterador de líneas de texto a csv.reader para que los delimitadores entre comillas y los registros de varias líneas sigan siendo datos CSV.

Para un archivo UTF-8 ilustrativo con punto y 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

Elija la codificación y el dialecto reales del archivo. Para una descarga pública de CSV por una ruta de proxy público permitida, la lista de proxies HTTP ofrece candidatos para la URL de routes. Esta versión normaliza los finales de línea físicos a LF: iter_lines los elimina y el generador vuelve a añadir un salto de línea para el analizador CSV. Eso importa cuando un campo entre comillas continúa en otra línea física.

Para flujos de trabajo que exigen conservar byte a byte los caracteres CRLF incrustados, use un envoltorio de texto en flujo que preserve esos finales de línea. La normalización deliberada del ejemplo encaja con el procesamiento orientado a registros donde LF es la representación prevista.

Una respuesta, muchas lecturas

El iterador consume fragmentos de una sola respuesta HTTP. No emite una petición nueva por cada línea. Las peticiones HTTP Range son otro mecanismo y no identifican por sí solas los límites de los registros CSV.

Llamar a response.text o reunir todas las filas en una lista traería todo el contenido de vuelta a memoria. La transmisión aún necesita espacio para los búferes de transporte y el registro actual, que puede contener por sí mismo un campo grande.

El contexto de la respuesta cierra el cuerpo al salir del bucle, incluso con una coincidencia temprana. El tiempo de espera de lectura limita la espera de datos entrantes, no la vida total de una transferencia de archivo grande.

Artículos relacionados