Python Requests और csv.reader के साथ बहु-पंक्ति CSV रिकॉर्ड स्ट्रीम करें
किसी प्रॉक्सी से आने वाले रिस्पॉन्स को 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 URL के लिए उम्मीदवार देती है। यह संस्करण भौतिक पंक्ति-अंतों को LF में सामान्य करता है: iter_lines उन्हें हटा देता है, और जनरेटर CSV पार्सर के लिए नई पंक्ति फिर से जोड़ता है। यह तब मायने रखता है जब उद्धरण चिह्नों वाला कोई फ़ील्ड किसी दूसरी भौतिक पंक्ति पर जारी रहता है।
ऐसे वर्कफ़्लो के लिए जिनमें एम्बेडेड CRLF अक्षरों को बाइट-सटीक रूप से सुरक्षित रखना ज़रूरी है, ऐसी स्ट्रीमिंग टेक्स्ट-रैपर व्यवस्था अपनाएँ जो उन पंक्ति-अंतों को बनाए रखे। उदाहरण का जानबूझकर किया गया सामान्यीकरण रिकॉर्ड-केंद्रित प्रोसेसिंग के लिए उपयुक्त है जहाँ LF अभीष्ट प्रस्तुति है।
एक रिस्पॉन्स, कई पठन
इटरेटर एक ही HTTP रिस्पॉन्स से टुकड़े लेता है। यह हर पंक्ति के लिए नया अनुरोध नहीं भेजता। HTTP Range अनुरोध एक भिन्न तंत्र हैं और वे स्वाभाविक रूप से CSV रिकॉर्ड की सीमाएँ नहीं पहचानते।
response.text कॉल करना या सभी पंक्तियों को सूची में इकट्ठा करना पूरी सामग्री को फिर से मेमोरी में ले आएगा। स्ट्रीमिंग को अब भी ट्रांसपोर्ट बफ़र और वर्तमान रिकॉर्ड के लिए जगह चाहिए, जिसमें स्वयं एक बड़ा फ़ील्ड हो सकता है।
रिस्पॉन्स संदर्भ लूप से बाहर निकलते समय बॉडी बंद कर देता है, जल्दी मिलान पर भी। पठन टाइमआउट आने वाले डेटा की प्रतीक्षा को सीमित करता है, किसी बड़ी फ़ाइल अंतरण के कुल जीवनकाल को नहीं।