Straume CSV-poster over fleire linjer med Python Requests og csv.reader
Straume eit svar gjennom ein proxy inn i csv.reader og ta vare på postgrensene i staden for å dele kvar fysiske linje ved skiljeteiknet.
stream=True let handsaminga starte før kroppen av eit svar gjennom ein proxy er lasta ned heilt. For CSV sender du ein iterator over tekstlinjer til csv.reader, slik at skiljeteikn i hermeteikn og postar over fleire linjer blir verande CSV-data.
For ei illustrerande UTF-8-fil med semikolon:
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
Vel den faktiske kodinga og dialekten til fila. For ei offentleg CSV-nedlasting via ei tillaten offentleg proxy-rute gir HTTP-proxy-lista kandidatar til routes-URL-en. Denne versjonen normaliserer fysiske linjeslutt til LF: iter_lines fjernar dei, og generatoren legg til ei ny linje for CSV-parsaren. Det betyr noko når eit felt i hermeteikn held fram på ei anna fysisk linje.
For arbeidsflytar som krev byte-nøyaktig bevaring av innbygde CRLF-teikn, bruk ei straumande tekstinnpakking som bevarer desse linjeslutta. Den medvite normaliseringa i dømet passar for postorientert handsaming der LF er den tiltenkte representasjonen.
Eitt svar, mange lesingar
Iteratoren brukar bitar frå eitt HTTP-svar. Han sender ikkje ein ny førespurnad for kvar linje. HTTP Range-førespurnader er ein annan mekanisme og identifiserer ikkje CSV-postgrenser av seg sjølv.
Å kalle response.text eller samle alle radene i ei liste ville hente heile innhaldet tilbake i minnet. Strauming treng framleis plass til transportbuffar og den gjeldande posten, som sjølv kan innehalde eit stort felt.
Svar-konteksten lukkar kroppen når løkka går ut, også ved eit tidleg treff. Lesetidsavbrotet avgrensar venting på innkommande data, ikkje den totale levetida til ein stor filoverføring.