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 URL-এর জন্য প্রার্থী দেয়। এই সংস্করণ ভৌত লাইন-শেষগুলোকে LF-এ স্বাভাবিক করে: iter_lines সেগুলো সরিয়ে দেয়, আর জেনারেটর CSV পার্সারের জন্য নতুন লাইন ফিরিয়ে যোগ করে। উদ্ধৃতির ভেতরের কোনো ফিল্ড আরেক ভৌত লাইনে চলতে থাকলে এটি গুরুত্বপূর্ণ।

এমবেড করা CRLF অক্ষর বাইট-নিখুঁতভাবে সংরক্ষণ দরকার এমন কর্মপ্রবাহের জন্য, সেই লাইন-শেষ রক্ষা করে এমন স্ট্রিমিং টেক্সট-র্যাপার ব্যবস্থা ব্যবহার করুন। উদাহরণের ইচ্ছাকৃত স্বাভাবিকীকরণ রেকর্ডকেন্দ্রিক প্রক্রিয়াকরণের জন্য উপযুক্ত, যেখানে LF-ই অভীষ্ট রূপ।

এক রেসপন্স, বহু পাঠ

ইটারেটরটি একটি HTTP রেসপন্স থেকে খণ্ড খণ্ড ডেটা নেয়। প্রতিটি লাইনের জন্য নতুন অনুরোধ পাঠায় না। HTTP Range অনুরোধ ভিন্ন পদ্ধতি এবং স্বাভাবিকভাবে CSV রেকর্ডের সীমা চিহ্নিত করে না।

response.text ডাকা বা সব সারি একটি তালিকায় জমা করা সম্পূর্ণ বিষয়বস্তু আবার মেমরিতে আনবে। স্ট্রিমিং-এর তবুও পরিবহন বাফার ও চলতি রেকর্ডের জন্য জায়গা লাগে, যেটি নিজেই বড় ফিল্ড ধারণ করতে পারে।

রেসপন্স কনটেক্সট লুপ থেকে বেরোনোর সময় বডি বন্ধ করে, আগেভাগে মিল পাওয়া হলেও। রিড টাইমআউট আগত ডেটার জন্য অপেক্ষা সীমিত করে, বড় ফাইল স্থানান্তরের মোট আয়ু নয়।

সম্পর্কিত নিবন্ধ