Python Requests жана csv.reader менен көп саптуу CSV жазууларын агымдап иштетүү
Прокси аркылуу келген жоопту 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 проксилер тизмеси routes URL үчүн талапкерлерди сунуштайт. Бул версия физикалык сап аяктарын LFке нормалдаштырат: iter_lines аларды алып салат, ал эми генератор CSV анализатору үчүн жаңы сапты кайра кошот. Бул тырмакча ичиндеги талаа башка физикалык сапка уланганда маанилүү.
Киргизилген CRLF белгилерин байт тактыгы менен сактоону талап кылган жумуш агымдары үчүн ошол сап аяктарын сактаган агымдык тексттик каптоо түзүлүшүн колдонуңуз. Мисалдагы атайын нормалдаштыруу LF максаттуу көрүнүш болгон жазууга багытталган иштетүүгө ылайыктуу.
Бир жооп, көп окуу
Итератор бир HTTP жообунан бөлүктөрдү керектейт. Ал ар бир сап үчүн жаңы сурам жөнөтпөйт. HTTP Range сурамдары башка механизм жана CSV жазууларынын чектерин өзүнөн аныктабайт.
response.text чакыруу же бардык саптарды тизмеге чогултуу бүт мазмунду кайра эстутумга алып келет. Агымдап иштетүүгө дагы эле транспорт буферлери жана учурдагы жазуу үчүн орун керек, ал өзү чоң талааны камтышы мүмкүн.
Жооп контексти циклден чыкканда денени жабат, эрте дал келүүдө да. Окуу убактысы кирүүчү маалыматты күтүүнү чектейт, чоң файл өткөрүүнүн жалпы узактыгын эмес.