stream=True låter bearbetningen börja innan kroppen i ett svar genom en proxy har laddats ner helt. För CSV skickar du en iterator över textrader till csv.reader så att avgränsare inom citattecken och poster över flera rader förblir CSV-data.

För en illustrativ UTF-8-fil med semikolon:

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

Välj filens faktiska kodning och dialekt. För en offentlig CSV-nedladdning via en tillåten offentlig proxyväg ger HTTP-proxylistan kandidater för routes-URL:en. Den här versionen normaliserar fysiska radslut till LF: iter_lines tar bort dem och generatorn lägger till en ny rad igen för CSV-parsern. Det spelar roll när ett fält inom citattecken fortsätter på en annan fysisk rad.

För arbetsflöden som kräver byte-exakt bevarande av inbäddade CRLF-tecken, använd en strömmande textinpackning som bevarar dessa radslut. Exemplets medvetna normalisering passar för postorienterad bearbetning där LF är den avsedda representationen.

Ett svar, många läsningar

Iteratorn förbrukar delar från ett enda HTTP-svar. Den utfärdar inte en ny begäran för varje rad. HTTP Range-begäranden är en annan mekanism och identifierar inte CSV-postgränser av sig själva.

Att anropa response.text eller samla alla rader i en lista skulle föra tillbaka hela innehållet i minnet. Strömning behöver fortfarande plats för transportbuffertar och den aktuella posten, som själv kan innehålla ett stort fält.

Svarskontexten stänger kroppen när loopen avslutas, även vid en tidig träff. Läs-timeouten begränsar väntan på inkommande data, inte den totala livstiden för en stor filöverföring.

Relaterade artiklar