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