अजगर में कई बाइनरी फ़ाइलों को ठीक से कैसे संभालना है?


10

मैं वर्तमान में PycURL मॉड्यूल की मदद से एक बहु-थ्रेडेड डाउनलोडर पर काम कर रहा हूं। मैं फाइलों के कुछ हिस्सों को डाउनलोड कर रहा हूं और उन्हें बाद में मर्ज कर रहा हूं।

भागों को कई थ्रेड्स से अलग-अलग डाउनलोड किया जाता है, उन्हें बाइनरी मोड में अस्थायी फ़ाइलों को लिखा जाता है, लेकिन जब मैं उन्हें सिंगल फाइल में विलय कर देता हूं (वे सही क्रम में विलय हो जाते हैं), तो चेकसम्स मेल नहीं खाते।

यह केवल linux env में होता है। विंडोज स्क्रिप्ट में समान स्क्रिप्ट त्रुटिपूर्ण रूप से काम करती है।

यह कोड (स्क्रिप्ट का हिस्सा) है जो फाइलों को मर्ज करता है:

with open(filename,'wb') as outfile:
    print('Merging temp files ...')
    for tmpfile in self.tempfile_arr:
        with open(tmpfile, 'rb') as infile:
            shutil.copyfileobj(infile, outfile)
    print('Done!')

मैंने भी write()विधि की कोशिश की , लेकिन यह एक ही मुद्दे के साथ परिणाम देता है, और यह बड़ी फ़ाइलों के लिए बहुत अधिक मेमोरी लेगा।

अगर मैं मैन्युअल रूप catसे लिनक्स में एक फाइल में पार्ट फाइल करता हूं , तो फाइल का चेकसम मेल खाता है, मुद्दा फाइलों के अजगर के विलय के साथ है।

संपादित करें:
यहां फाइलें और चेकसम (sha256) हैं जिनका उपयोग मैंने इस मुद्दे को दोहराने के लिए किया है:


2
मुझे लगता है कि आपका openमोड सही नहीं है ( wb)। के आधार पर stackoverflow.com/a/4388244/3727050 आप की जरूरत abहै (या r+bऔर seek)
शहरी

3
आपको कुछ उदाहरण टेम्पोफाइल्स सहित न्यूनतम प्रजनन योग्य उदाहरण प्रदान करने की आवश्यकता है । मुझे लगता है कि आपको बस कुछ बाइट्स प्रत्येक के कुछ टेंपरेपल्स के साथ समस्या को पुन: उत्पन्न करने में सक्षम होना चाहिए। उम्मीद है कि बफर आकार समस्या का हिस्सा नहीं है। इसके अलावा बाइनरी मोड संभवतः महत्वपूर्ण नहीं है, इसलिए आप सादे पाठ फ़ाइलों का उपयोग कर सकते हैं।
wjandrea 17

FWIW मैं दुर्भाग्य से लिनक्स पर दो बहुत छोटी पाठ फ़ाइलों के साथ समस्या को पुन: पेश करने में सक्षम नहीं था।
वेजेंड्रिया

दरअसल pycurl को डेटा लिखने के लिए बाइनरी मोड की आवश्यकता होती है।
सौम्यकांता साहू

3
: ठीक है, फ़ाइलों को मदद लेकिन अपने कोड अभी भी अधूरा है filename, self.tempfile_arrऔर shutilअपरिभाषित कर रहे हैं
wjandrea

जवाबों:


0

न्यूनतम रूप से प्रतिलिपि प्रस्तुत करने योग्य मामला सुविधाजनक होगा, लेकिन मुझे इस मामले में सार्वभौमिक नई सूचियों पर संदेह होगा: डिफ़ॉल्ट रूप से, यदि आपकी फाइलें विंडोज़ शैली की पाठ (newlines हैं \r\n) तो वे यूनिक्स-शैली की नई सूचियों ( \n) पर अनुवादित होने जा रही हैं पढ़ने। और फिर उन यूनिक्स-शैली की नई रूपरेखाएँ आउटपुट फ़ाइल में वापस लिखी जाने वाली हैं बजाय कि विंडोज-शैली वाले जो आप उम्मीद कर रहे थे। यह अजगर और cat(जो कोई भी अनुवाद नहीं करेगा) के बीच विचलन की व्याख्या करेगा ।

अपनी स्क्रिप्ट पासिंग newline=''(खाली स्ट्रिंग) को चलाने का प्रयास करें open

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.