stream=True permet de commencer le traitement avant que le corps d'une réponse via un proxy soit entièrement téléchargé. Pour le CSV, passez un itérateur de lignes de texte à csv.reader afin que les séparateurs entre guillemets et les enregistrements multilignes restent des données CSV.

Pour un fichier UTF-8 illustratif utilisant des points-virgules :

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

Choisissez l'encodage et le dialecte réels du fichier. Pour un téléchargement CSV public via une route de proxy public autorisée, la liste de proxys HTTP fournit des candidats pour l'URL routes. Cette version normalise les fins de ligne physiques en LF : iter_lines les supprime et le générateur rajoute un saut de ligne pour l'analyseur CSV. Cela compte lorsqu'un champ entre guillemets se poursuit sur une autre ligne physique.

Pour les flux de travail exigeant une préservation octet par octet des caractères CRLF intégrés, utilisez un agencement d'enveloppe textuelle en flux qui conserve ces fins de ligne. La normalisation délibérée de l'exemple convient au traitement orienté enregistrements où LF est la représentation voulue.

Une réponse, plusieurs lectures

L'itérateur consomme des blocs d'une seule réponse HTTP. Il n'émet pas de nouvelle requête pour chaque ligne. Les requêtes HTTP Range sont un autre mécanisme et n'identifient pas naturellement les frontières d'enregistrements CSV.

Appeler response.text ou rassembler toutes les lignes dans une liste ramènerait tout le contenu en mémoire. La diffusion en flux a toujours besoin de place pour les tampons de transport et l'enregistrement courant, qui peut lui-même contenir un champ volumineux.

Le contexte de la réponse ferme le corps à la sortie de la boucle, y compris lors d'une correspondance précoce. Le délai de lecture borne l'attente de données entrantes, non la durée totale d'un transfert de fichier volumineux.

Articles similaires