python - writing decompressed file to disk fetched from web server -
मुझे एक फ़ाइल मिल सकती है जिसमें content-encoding
जैसा gzip
।
तो क्या इसका मतलब यह है कि सर्वर उसे संपीड़ित फ़ाइल के रूप में संग्रहीत कर रहा है या क्या यह भी संकुचित ज़िप या 7z फ़ाइलों के रूप में संग्रहीत फ़ाइलों के लिए भी सही है?
और यदि ऐसा है (जहां < कोड> डर्ल एक ज़िप फ़ाइल है)
& gt; & gt; & gt; Durl = 'https://db.tt/Kq0byWzW' & gt; & gt; & gt; Dresp = requests.get (durl, allow_redirects = ट्रू, स्ट्रीम = ट्रू) & gt; & gt; & gt; Dresp.headers ['सामग्री-एन्कोडिंग'] 'gzip' & gt; & gt; & gt; R = requests.get (डरल, स्ट्रीम = ट्रू)> gt; & gt; & gt; डेटा = r.raw.read (decode_content = true)
लेकिन जब मैं जाप पर डिस्क पर ज़िप फ़ाइल निकालना चाहता हूं, तब डेटा रिक्त हो रहा है!
तो सबसे पहले durl
एक ज़िप फ़ाइल नहीं है, यह एक ड्रॉप बॉक्स लैंडिंग पृष्ठ है । तो आप जो देख रहे हैं वह HTML है जो जीज़िप एन्कोडिंग का उपयोग करते हुए भेजा जा रहा है। यदि आप जिज़िप का उपयोग करते हुए कच्चे सॉकेट के डेटा को डिकोड करना चाहते हैं, तो आप केवल HTML प्राप्त करेंगे। इसलिए कच्चे का प्रयोग वास्तव में छिपा रहा है कि आप गलती से किसी अन्य फ़ाइल को अपने विचार के मुकाबले कहीं भी ले जाते हैं।
आप कहां पर आधारित हैं
क्या किसी के पास कोई विचार है डंप करने के लिए डिस्क को संकुचित फाइल डायरेक्ट लिखी गई है?
मैं इसे लेता हूं आप वास्तव में एक ज़िप लाने की कोशिश कर रहे हैं ऐसा करने के लिए आपको उपयोग करने की आवश्यकता है
हालांकि इस समस्या में यह हो जाता है कि अनुरोधों से प्रतिक्रिया वास्तव में खोजी नहीं है, जो काम करने के लिए ज़िफ़फ़ाइल की आवश्यकता होती है (इसे करने वाली पहली चीजों में से एक फ़ाइल के अंत में यह निर्धारित करने के लिए कि यह कब तक है)।
इस के आसपास पाने के लिए आपको ऑब्जेक्ट जैसी फ़ाइल में प्रतिक्रिया लपेटनी होगी निजी तौर पर मैं tempfile.SpooledTemporaryFile
का उपयोग करके एक अधिकतम आकार सेट के साथ सुझाऊंगा। इस तरह आपका कोड चीजों को डिस्क पर लिखने पर स्विच करेगा यदि फ़ाइल आपके द्वारा अपेक्षा की गई थी।
आयात अनुरोधों आयात tempfile आयात zipfile KB = 1 & lt; 10; 9 एमबी = 1 & lt; & lt; 20 Url = '...' # डाउनलोड लिंक पर url सेट करें Resp = requests.get (url, stream = true) tmp के रूप में tempfile.SpooledTemporaryFile (max_size = 500 * एमबी): resp.iter_content (4 * केबी) में चक के लिए: tmp.write (चक) संग्रह = zipfile.ZipFile ( Tmp) archive.extractall (पथ)
io.BytesIO
का उपयोग कर एक ही कोड:
resp = requests.get (url , धारा = सच) resp.iter_content (4 * केबी) में चक के लिए tmp = io.BytesIO (): tmp.write (चक) संग्रह = ज़िपफ़ाइल। ज़िपफ़ाइल (टीएमपी) संग्रह। एक्सट्रैक्ट (पथ) कोड> पूर्व>
Comments
Post a Comment