پخش جریانی رکوردهای چندخطی CSV با Python Requests و csv.reader
پاسخ عبوری از پروکسی را به csv.reader بفرستید و مرزهای رکورد را حفظ کنید، نه اینکه هر خط فیزیکی را روی جداکننده تقسیم کنید.
stream=True اجازه میدهد پردازش پیش از کامل دانلود شدن بدنهٔ پاسخی که از پروکسی میگذرد آغاز شود. برای CSV، یک تکرارگر خطوط متنی به csv.reader بدهید تا جداکنندههای داخل گیومه و رکوردهای چندخطی دادهٔ CSV بمانند.
برای یک فایل نمونهٔ UTF-8 با نقطهویرگول:
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
کدگذاری و گویش واقعی فایل را انتخاب کنید. برای دانلود عمومی CSV روی مسیر پروکسی عمومی مجاز، فهرست پروکسی HTTP نامزدهایی برای نشانی routes فراهم میکند. این نسخه پایان خطوط فیزیکی را به LF نرمالسازی میکند: iter_lines آنها را حذف میکند و مولد برای تجزیهگر CSV یک خط جدید برمیگرداند. این وقتی مهم است که یک فیلد داخل گیومه به خط فیزیکی دیگری ادامه یابد.
برای جریانهای کاری که حفظ بایتبهبایت نویسههای CRLF جاسازیشده را لازم دارند، از چیدمان پوشش متنی جریانی که آن پایانهای خط را نگه میدارد استفاده کنید. نرمالسازی عمدی مثال برای پردازش رکوردمحور مناسب است، جایی که LF نمایش موردنظر است.
یک پاسخ، خواندنهای بسیار
تکرارگر تکههایی از یک پاسخ HTTP را مصرف میکند و برای هر خط درخواست تازهای نمیفرستد. درخواستهای HTTP Range سازوکار دیگریاند و بهطور طبیعی مرزهای رکورد CSV را مشخص نمیکنند.
فراخوانی response.text یا گردآوری همهٔ سطرها در یک فهرست، کل محتوا را به حافظه برمیگرداند. پخش جریانی هنوز به جا برای بافرهای انتقال و رکورد جاری نیاز دارد که خودش میتواند فیلدی بزرگ داشته باشد.
زمینهٔ پاسخ هنگام خروج از حلقه بدنه را میبندد، از جمله در تطابق زودهنگام. مهلت خواندن، انتظار برای دادهٔ ورودی را محدود میکند، نه کل عمر انتقال یک فایل بزرگ را.