मैं वर्तमान में 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) हैं जिनका उपयोग मैंने इस मुद्दे को दोहराने के लिए किया है:
- मूल फ़ाइल
- एचएएसएच: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
- स्क्रिप्ट द्वारा मर्ज की गई फ़ाइल
- HASH: c3e5a0404da480f36d37b65053732966d19034f60c3004a908b88d459db7d87
बिल्ली का उपयोग करके मैन्युअल रूप से फ़ाइल मर्ज की गई
- एचएएसएच: 158575ed12e705a624c3134ffe3138987c64d6a7298c5a81794ccf6866efd488
उपयोग की गई कमांड:
for i in /tmp/pycurl_*_{0..7}; do cat $i >> manually_merged.tar.gz; done
भाग फ़ाइलें - अंत में गिने, 0 से 7 के माध्यम से
filename
, self.tempfile_arr
और shutil
अपरिभाषित कर रहे हैं
open
मोड सही नहीं है (wb
)। के आधार पर stackoverflow.com/a/4388244/3727050 आप की जरूरतab
है (याr+b
औरseek
)