পাইথনে একাধিক বাইনারি ফাইলগুলি কীভাবে সঠিকভাবে পরিচালনা করবেন?


10

আমি বর্তমানে পাইসিআরএল মডিউলটির সাহায্যে একাধিক-থ্রেডযুক্ত ডাউনলোডারে কাজ করছি। আমি ফাইলগুলির কিছু অংশ ডাউনলোড করছি এবং সেগুলি পরে মার্জ করছি।

অংশগুলি একাধিক থ্রেড থেকে পৃথকভাবে ডাউনলোড করা হয়, সেগুলি বাইনারি মোডে অস্থায়ী ফাইলগুলিতে লেখা হয়, তবে আমি যখন তাদের একক ফাইলে মার্জ করি (সেগুলি সঠিক ক্রমে মিশে যায়), চেকসামগুলি মেলে না।

এটি কেবল লিনাক্স এনভির মধ্যে ঘটে। একই স্ক্রিপ্টটি উইন্ডোজ এনভিও-তে নির্দোষভাবে কাজ করে।

এটি কোড (স্ক্রিপ্টের অংশ) যা ফাইলগুলিকে মার্জ করে:

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)। স্ট্যাকওভারফ্লো . com/a/4388244/3727050 এর উপর ভিত্তি করে আপনার প্রয়োজন ab(বা r+bএবং seek)
নগর

3
আপনাকে কয়েকটি উদাহরণ টেম্পাইল সহ ন্যূনতম প্রজননযোগ্য উদাহরণ সরবরাহ করতে হবে। আমি মনে করি আপনার প্রতি কয়েকটা বাইটের কয়েকটি টেম্পাইল সহ সমস্যাটি পুনরুত্পাদন করতে সক্ষম হওয়া উচিত। আশা করি বাফার আকার সমস্যার অংশ নয়। এছাড়াও বাইনারি মোড সম্ভবত গুরুত্বপূর্ণ নয়, তাই আপনি সরল পাঠ্য ফাইল ব্যবহার করতে পারেন।
wjandrea

দুর্ভাগ্যক্রমে লিনাক্সের দুটি খুব সংক্ষিপ্ত পাঠ্য ফাইল নিয়ে আমি এফডাব্লুআইডাব্লু সমস্যাটি পুনরুত্পাদন করতে পারিনি।
wjandrea

আসলে পাইকারল ডেটা লিখতে বাইনারি মোডের প্রয়োজন।
সৌম্যকান্ত সাহু

3
: ঠিক আছে, ফাইল সাহায্যের কিন্তু আপনার কোড এখনও অসম্পূর্ণ এর filename, self.tempfile_arrএবং shutilঅনির্দিষ্ট হয়
wjandrea

উত্তর:


0

একটি সংক্ষিপ্ত পরিমাণে পুনরুত্পাদনযোগ্য কেসটি সুবিধাজনক হবে তবে আমি এই সমস্যাটি হিসাবে সর্বজনীন নিউলাইনগুলিকে সন্দেহ করব : ডিফল্টরূপে, যদি আপনার ফাইলগুলি উইন্ডোজ-স্টাইলের পাঠ্য হয় (নিউলাইনগুলি হয় \r\n) তবে তারা ইউনিক্স-স্টাইলের নিউলাইনগুলিতে অনুবাদ করতে চলেছে ( \n) পড়া চালিয়ে যান। এবং তারপরে un ইউনিক্স-স্টাইলের নিউলাইনগুলি আপনি যে উইন্ডোজ-স্টাইলের প্রত্যাশা করেছিলেন তার চেয়ে বেশি আউটপুট ফাইলে লিখিত হতে চলেছে। এটি অজগর এবং cat(যা কোনও অনুবাদ করবে না) এর মধ্যে বিভেদ ব্যাখ্যা করবে ।

আপনার স্ক্রিপ্টটি পাস করার newline=''(খালি স্ট্রিং) চালানোর চেষ্টা করুন open

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.