Alirkan Rekaman CSV Multibaris dengan Python Requests dan csv.reader
Alirkan respons melalui proxy ke csv.reader dan pertahankan batas rekaman alih-alih memecah setiap baris fisik pada pemisah.
stream=True memungkinkan pemrosesan dimulai sebelum isi respons melalui proxy selesai diunduh sepenuhnya. Untuk CSV, teruskan iterator baris teks ke csv.reader agar pemisah di dalam tanda kutip dan rekaman multibaris tetap menjadi data CSV.
Untuk contoh berkas UTF-8 yang memakai titik koma:
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
Pilih pengodean dan dialek berkas yang sebenarnya. Untuk unduhan CSV publik melalui rute proxy publik yang diizinkan, daftar proxy HTTP menyediakan kandidat untuk URL routes. Versi ini menormalkan akhir baris fisik menjadi LF: iter_lines menghapusnya, dan generator menambahkan baris baru kembali untuk parser CSV. Itu penting ketika bidang di dalam tanda kutip berlanjut ke baris fisik lain.
Untuk alur kerja yang menuntut pelestarian persis per byte karakter CRLF yang tertanam, gunakan susunan pembungkus teks streaming yang mempertahankan akhir baris tersebut. Normalisasi yang disengaja dalam contoh cocok untuk pemrosesan berorientasi rekaman yang LF menjadi representasi yang dimaksudkan.
Satu respons, banyak pembacaan
Iterator mengonsumsi potongan dari satu respons HTTP. Ia tidak mengirim permintaan baru untuk setiap baris. Permintaan HTTP Range adalah mekanisme lain dan tidak secara alami mengenali batas rekaman CSV.
Memanggil response.text atau mengumpulkan semua baris ke dalam daftar akan membawa seluruh konten kembali ke memori. Streaming tetap membutuhkan ruang untuk buffer transport dan rekaman saat ini, yang dapat berisi bidang besar.
Konteks respons menutup isi saat perulangan keluar, termasuk saat ada kecocokan awal. Batas waktu baca membatasi penantian data masuk, bukan umur total transfer berkas besar.