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