Ang stream=True ay nagpapahintulot na magsimula ang pagproseso bago pa man ganap na ma-download ang katawan ng tugon sa pamamagitan ng proxy. Para sa CSV, ipasa ang isang iterator ng mga linya ng teksto sa csv.reader upang ang mga delimiter sa loob ng mga quote at ang mga multiline na record ay manatiling CSV data.

Para sa isang halimbawang UTF-8 na file na gumagamit ng mga tuldok-kuwit:

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

Piliin ang aktwal na encoding at dialect ng file. Para sa pampublikong pag-download ng CSV sa isang pinapayagang pampublikong ruta ng proxy, nagbibigay ang listahan ng HTTP proxy ng mga kandidato para sa URL ng routes. Ginagawa ng bersyong ito na LF ang mga pisikal na dulo ng linya: inaalis sila ng iter_lines, at nagdadagdag muli ang generator ng bagong linya para sa CSV parser. Mahalaga iyon kapag ang isang field sa loob ng mga quote ay nagpapatuloy sa isa pang pisikal na linya.

Para sa mga workflow na nangangailangan ng byte-exact na pagpapanatili ng mga naka-embed na CRLF na character, gumamit ng streaming text-wrapper na setup na pinapanatili ang mga dulo ng linyang iyon. Ang sinadyang normalisasyon sa halimbawa ay angkop sa pagprosesong nakatuon sa record kung saan ang LF ang nilalayong representasyon.

Isang tugon, maraming pagbasa

Ginagamit ng iterator ang mga tipak mula sa isang tugon ng HTTP. Hindi ito naglalabas ng bagong kahilingan para sa bawat linya. Ang mga kahilingang HTTP Range ay ibang mekanismo at hindi natural na tinutukoy ang mga hangganan ng CSV record.

Ang pagtawag sa response.text o pagkolekta ng lahat ng row sa isang listahan ay magbabalik ng buong nilalaman sa memorya. Kailangan pa rin ng streaming ng espasyo para sa mga buffer ng transport at sa kasalukuyang record, na maaaring maglaman mismo ng malaking field.

Isinasara ng konteksto ng tugon ang katawan kapag lumabas ang loop, kabilang ang isang maagang pagtutugma. Nililimitahan ng read timeout ang paghihintay ng papasok na data, hindi ang kabuuang buhay ng isang malaking paglilipat ng file.

Kaugnay na mga artikulo