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

Popular posts from this blog

java - org.apache.http.ProtocolException: Target host is not specified -

java - Gradle dependencies: compile project by relative path -

ruby on rails - Object doesn't support #inspect when used with .include -