Потоковая обработка многострочных записей CSV с Python Requests и csv.reader
Передавайте ответ через прокси в csv.reader потоком и сохраняйте границы записей, а не делите каждую физическую строку по разделителю.
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 или сбор всех строк в список вернул бы всё содержимое обратно в память. Потоковой обработке всё равно нужно место для транспортных буферов и текущей записи, которая сама может содержать большое поле.
Контекст ответа закрывает тело при выходе из цикла, в том числе при раннем совпадении. Тайм-аут чтения ограничивает ожидание входящих данных, а не общее время передачи большого файла.