stream=True pozwala rozpocząć przetwarzanie, zanim treść odpowiedzi przez proxy zostanie w pełni pobrana. W przypadku CSV przekaż do csv.reader iterator wierszy tekstowych, aby separatory w cudzysłowach i rekordy wielowierszowe pozostały danymi CSV.

Dla przykładowego pliku UTF-8 ze średnikami:

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

Wybierz rzeczywiste kodowanie i dialekt pliku. Do publicznego pobierania CSV przez dozwoloną publiczną trasę proxy lista proxy HTTP oferuje kandydatów dla adresu routes. Ta wersja normalizuje fizyczne końce wierszy do LF: iter_lines je usuwa, a generator dodaje nowy wiersz dla parsera CSV. Ma to znaczenie, gdy pole w cudzysłowie przechodzi do innego fizycznego wiersza.

W przypadku przepływów pracy wymagających zachowania osadzonych znaków CRLF co do bajtu użyj strumieniowego otoczenia tekstowego, które zachowuje te końce wierszy. Celowa normalizacja w przykładzie pasuje do przetwarzania zorientowanego na rekordy, gdzie LF jest zamierzoną reprezentacją.

Jedna odpowiedź, wiele odczytów

Iterator zużywa fragmenty jednej odpowiedzi HTTP. Nie wysyła nowego żądania dla każdego wiersza. Żądania HTTP Range to inny mechanizm i nie rozpoznają naturalnie granic rekordów CSV.

Wywołanie response.text lub zebranie wszystkich wierszy w listę przywróciłoby całą zawartość do pamięci. Strumieniowanie nadal wymaga miejsca na bufory transportowe i bieżący rekord, który sam może zawierać duże pole.

Kontekst odpowiedzi zamyka treść po wyjściu z pętli, także przy wczesnym dopasowaniu. Limit czasu odczytu ogranicza oczekiwanie na dane przychodzące, a nie całkowity czas transferu dużego pliku.

Powiązane artykuły