Transmetimi në rrjedhë i regjistrimeve CSV me shumë rreshta me Python Requests dhe csv.reader
Transmetoni në rrjedhë një përgjigje përmes një proxy në csv.reader dhe ruani kufijtë e regjistrimeve në vend që të ndani çdo rresht fizik tek ndarësi.
stream=True lejon që përpunimi të fillojë para se trupi i një përgjigjeje përmes një proxy të jetë shkarkuar plotësisht. Për CSV, kaloni një përsëritës të rreshtave të tekstit te csv.reader, në mënyrë që ndarësit brenda thonjëzave dhe regjistrimet me shumë rreshta të mbeten të dhëna CSV.
Për një skedar ilustrues UTF-8 që përdor pikëpresje:
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
Zgjidhni kodimin dhe dialektin aktual të skedarit. Për një shkarkim publik CSV përmes një rruge proxy publike të lejuar, lista e proxy-ve HTTP ofron kandidatë për URL-në routes. Ky version normalizon mbarimet fizike të rreshtave në LF: iter_lines i heq ato dhe gjeneratorri shton përsëri një rresht të ri për analizuesin CSV. Kjo ka rëndësi kur një fushë brenda thonjëzave vazhdon në një rresht tjetër fizik.
Për rrjedhat e punës që kërkojnë ruajtje të saktë në bajt të karaktereve CRLF të ngulitura, përdorni një mbështjellës teksti në rrjedhë që ruan ato mbarime rreshtash. Normalizimi i qëllimshëm i shembullit përshtatet me përpunimin e orientuar drejt regjistrimeve ku LF është paraqitja e synuar.
Një përgjigje, shumë lexime
Përsëritësi konsumon pjesë nga një përgjigje e vetme HTTP. Ai nuk lëshon një kërkesë të re për çdo rresht. Kërkesat HTTP Range janë një mekanizëm tjetër dhe nuk i identifikojnë natyrshëm kufijtë e regjistrimeve CSV.
Thirrja e response.text ose mbledhja e të gjitha rreshtave në një listë do të sillte përmbajtjen e plotë përsëri në memorie. Transmetimi ka ende nevojë për hapësirë për buferat e transportit dhe regjistrimin aktual, i cili vetë mund të përmbajë një fushë të madhe.
Konteksti i përgjigjes mbyll trupin kur cikli del, përfshirë një përputhje të hershme. Afati i leximit kufizon pritjen për të dhëna hyrëse, jo jetëgjatësinë totale të një transferimi të madh skedari.