Strimovanje višerednih CSV zapisa uz Python Requests i csv.reader
Proslijedite odgovor kroz proxy u csv.reader i sačuvajte granice zapisa umjesto dijeljenja svakog fizičkog retka na razdjelniku.
stream=True omogućuje početak obrade prije nego što je tijelo odgovora kroz proxy u cijelosti preuzeto. Za CSV proslijedite iterator tekstualnih redaka u csv.reader kako bi razdjelnici pod navodnicima i višeredni zapisi ostali CSV podaci.
Za ilustrativnu UTF-8 datoteku s točka-zapisom:
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
Odaberite stvarni kodni raspored i dijalekt datoteke. Za javno preuzimanje CSV-a preko dopuštene javne proxy rute popis HTTP proxyja nudi kandidate za URL routes. Ova verzija normalizira fizičke završetke redaka u LF: iter_lines ih uklanja, a generator vraća novi redak za CSV parser. To je važno kada se polje pod navodnicima nastavlja na drugi fizički redak.
Za tokove rada koji zahtijevaju bajt-točno očuvanje ugrađenih CRLF znakova, upotrijebite strimirajući tekstualni omotač koji čuva te završetke redaka. Namjerna normalizacija u primjeru prikladna je za obradu usmjerenu na zapise gdje je LF namjeravani prikaz.
Jedan odgovor, mnogo čitanja
Iterator troši dijelove jednog HTTP odgovora. Ne šalje novi zahtjev za svaki redak. HTTP Range zahtjevi su drugi mehanizam i ne prepoznaju prirodno granice CSV zapisa.
Pozivanje response.text ili skupljanje svih redaka u popis vratilo bi cijeli sadržaj natrag u memoriju. Strimovanje i dalje treba prostor za transportne međuspremnike i trenutni zapis, koji sam može sadržavati veliko polje.
Kontekst odgovora zatvara tijelo kada petlja završi, uključujući rano podudaranje. Vremensko ograničenje čitanja ograničava čekanje na dolazne podatke, a ne ukupni životni vijek prijenosa velike datoteke.