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