Többsoros CSV-rekordok streamelése Python Requestsszel és csv.readerrel
Streamelje egy proxy-n át érkező választ a csv.readerbe, és őrizze meg a rekordok határait ahelyett, hogy minden fizikai sort felosztana az elválasztónál.
A stream=True lehetővé teszi a feldolgozás elkezdését, mielőtt egy proxy-n át érkező válasz törzse teljesen letöltődne. CSV esetén adjon át egy szövegsor-iterátort a csv.readernek, hogy az idézőjelek közötti elválasztók és a többsoros rekordok CSV-adatok maradjanak.
Egy szemléltető, pontosvesszőt használó UTF-8 fájl esetén:
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
Válassza a fájl tényleges kódolását és dialektusát. Egy engedélyezett nyilvános proxy-útvonalon történő nyilvános CSV-letöltéshez a HTTP-proxy lista kínál jelölteket a routes URL-hez. Ez a változat a fizikai sorvégeket LF-re normalizálja: az iter_lines eltávolítja őket, a generátor pedig újra hozzáad egy sort a CSV-elemzőnek. Ez akkor számít, amikor egy idézőjelek közötti mező egy másik fizikai sorban folytatódik.
Azokhoz a munkafolyamatokhoz, amelyek a beágyazott CRLF-karakterek bájtra pontos megőrzését igénylik, használjon olyan streamelő szövegburkoló elrendezést, amely megőrzi ezeket a sorvégeket. A példa szándékos normalizálása a rekordorientált feldolgozáshoz illik, ahol az LF a kívánt reprezentáció.
Egy válasz, sok olvasás
Az iterátor egyetlen HTTP-válasz darabjait fogyasztja. Nem indít új kérést minden sorhoz. A HTTP Range kérések más mechanizmus, és önmagukban nem azonosítják a CSV-rekordok határait.
A response.text meghívása vagy az összes sor listába gyűjtése az egész tartalmat visszahozná a memóriába. A streamelésnek továbbra is helyre van szüksége az átviteli pufferekhez és az aktuális rekordhoz, amely maga is tartalmazhat nagy mezőt.
A válasz kontextusa bezárja a törzset, amikor a ciklus kilép, korai egyezés esetén is. Az olvasási időkorlát a beérkező adatokra való várakozást korlátozza, nem egy nagy fájlátvitel teljes élettartamát.