stream=True позволява обработката да започне, преди тялото на отговора през прокси да е напълно изтеглено. За CSV подайте итератор на текстови редове към csv.reader, така че разделителите в кавички и многоредовите записи да останат CSV данни.

За илюстративен UTF-8 файл с точка и запетая:

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

Изберете действителното кодиране и диалект на файла. За публично изтегляне на CSV по разрешен публичен прокси маршрут списъкът с HTTP проксита предлага кандидати за URL адреса routes. Тази версия нормализира физическите краища на редовете до LF: iter_lines ги премахва, а генераторът добавя нов ред обратно за CSV парсера. Това е важно, когато поле в кавички продължава на друг физически ред.

За работни процеси, изискващи побайтово запазване на вградените CRLF знаци, използвайте потокова текстова обвивка, която запазва тези краища на редовете. Умишлената нормализация в примера е подходяща за обработка, ориентирана към записи, където LF е желаното представяне.

Един отговор, много четения

Итераторът консумира парчета от един HTTP отговор. Той не издава нова заявка за всеки ред. HTTP Range заявките са различен механизъм и не идентифицират естествено границите на CSV записите.

Извикването на response.text или събирането на всички редове в списък би върнало цялото съдържание в паметта. Поточността все още се нуждае от място за транспортни буфери и текущия запис, който сам може да съдържа голямо поле.

Контекстът на отговора затваря тялото при излизане от цикъла, включително при ранно съвпадение. Таймаутът за четене ограничава изчакването за входящи данни, а не общия живот на голям файлов трансфер.

Подобни статии