Pretakanje večvrstičnih zapisov CSV s Python Requests in csv.reader
Pretakajte odgovor skozi proxy v csv.reader in ohranite meje zapisov, namesto da bi vsako fizično vrstico razdelili na ločilu.
stream=True omogoča začetek obdelave, preden je telo odgovora skozi proxy v celoti preneseno. Za CSV posredujte csv.readerju iterator besedilnih vrstic, da ločila v narekovajih in večvrstični zapisi ostanejo podatki CSV.
Za ponazoritveno datoteko UTF-8 s podpičji:
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
Izberite dejansko kodiranje in narečje datoteke. Za javni prenos CSV po dovoljeni javni proxy poti seznam proxy strežnikov HTTP ponuja kandidate za URL routes. Ta različica normalizira fizične konce vrstic v LF: iter_lines jih odstrani, generator pa za razčlenjevalnik CSV doda novo vrstico nazaj. To je pomembno, ko se polje v narekovajih nadaljuje v drugi fizični vrstici.
Za delovne tokove, ki zahtevajo bajtno natančno ohranitev vdelanih znakov CRLF, uporabite pretakajoče se besedilno ovojnico, ki ohrani te konce vrstic. Namerna normalizacija v primeru ustreza obdelavi, usmerjeni v zapise, kjer je LF predvidena predstavitev.
En odgovor, veliko branj
Iterator porablja dele enega odgovora HTTP. Ne pošlje nove zahteve za vsako vrstico. Zahteve HTTP Range so drug mehanizem in ne prepoznajo samodejno mej zapisov CSV.
Klic response.text ali zbiranje vseh vrstic na seznam bi vrnilo celotno vsebino nazaj v pomnilnik. Pretakanje še vedno potrebuje prostor za transportne medpomnilnike in trenutni zapis, ki lahko sam vsebuje veliko polje.
Kontekst odgovora zapre telo ob izstopu iz zanke, tudi pri zgodnjem ujemanju. Časovna omejitev branja omejuje čakanje na vhodne podatke, ne celotnega trajanja prenosa velike datoteke.