উত্তর:
একটি সম্পূর্ণ ডিরেক্টরি গাছের জন্য একটি .tar.gz(ওরফে .tgz) তৈরি করতে :
import tarfile
import os.path
def make_tarfile(output_filename, source_dir):
with tarfile.open(output_filename, "w:gz") as tar:
tar.add(source_dir, arcname=os.path.basename(source_dir))
এটি একই নাম এবং বিষয়বস্তু সহ একটি একক শীর্ষ-স্তরের ফোল্ডারযুক্ত একটি জিজেপড টার আর্কাইভ তৈরি করবে source_dir।
arcname=os.path.basename(source_dir)তবে এটি আপনাকে source_dirটার ফাইলের পুরো পথ কাঠামোটি দেবে (বেশিরভাগ ক্ষেত্রে, এটি সম্ভবত অসুবিধাগ্রস্থ)।
arcname=os.path.basename(source_dir)এখনও ব্যবহারের অর্থ সংরক্ষণাগারটিতে এমন একটি ফোল্ডার রয়েছে যা এর সামগ্রীগুলি অন্তর্ভুক্ত করে source_dir। আপনি যদি সংরক্ষণাগারটির মূলটি কোনও ফোল্ডারে থাকা সামগ্রীগুলি না রেখে নিজেই সংরক্ষণ করতে চান তবে arcname=os.path.sepপরিবর্তে ব্যবহার করুন।
os.path.sepতবে সংরক্ষণাগারটিতে পরিষেবা থাকবে ""। বা "/" ফোল্ডার যা সাধারণত কোনও সমস্যা হয় না, তবে আপনি পরে এই আর্কাইভটিকে প্রোগ্রামগতভাবে প্রক্রিয়াজাত করে যদি কখনও কখনও এটি কোনও সমস্যা হতে পারে। os.walkপৃথকভাবে ফাইলগুলি করা এবং যুক্ত করার একমাত্র আসল পরিষ্কার উপায় বলে মনে হচ্ছে
arcname='.'। ব্যবহার করার দরকার নেই os.walk।
import tarfile
tar = tarfile.open("sample.tar.gz", "w:gz")
for name in ["file1", "file2", "file3"]:
tar.add(name)
tar.close()
আপনি যদি একটি tar.bz2 সংক্ষিপ্ত ফাইল তৈরি করতে চান তবে কেবল ফাইলের এক্সটেনশনের নামটি ".tar.bz2" এবং "w: gz" এর সাথে "w: bz2" দিয়ে প্রতিস্থাপন করুন।
with tarfile.open( ..কল openএবং closeম্যানুয়ালি পরিবর্তে আপনার পাইথনটিতে সত্যই ব্যবহার করা উচিত । নিয়মিত ফাইলগুলি খোলার সময় এটিও ঘটে।
আপনি তারফিল.ওপেনকে কল করেছেন mode='w:gz', যার অর্থ " জিজিপ সংক্ষেপিত লেখার জন্য উন্মুক্ত"।
আপনি সম্ভবত ফাইলের নামটি দিয়ে ( nameযুক্তিটি দিয়ে open) শেষ করতে চাইবেন .tar.gzতবে এটি সংকোচনের ক্ষমতাগুলিকে প্রভাবিত করে না।
বিটিডাব্লু, আপনি সাধারণত একটি মোডের সাথে আরও ভাল সংক্ষেপণ পান 'w:bz2', ঠিক tarতেমনভাবে bzip2এটি সংকোচনের চেয়ে আরও ভাল সংকোচন করতে পারে gzip।
পূর্ববর্তী উত্তরগুলি tarfileপাইথনে একটি .tar.gzফাইল তৈরি করার জন্য পাইথন মডিউলটি ব্যবহার করার পরামর্শ দেয় । এটি স্পষ্টতই একটি ভাল এবং পাইথন-শৈলীর সমাধান, তবে এটি সংরক্ষণাগারটির গতিতে গুরুতর অসুবিধা রয়েছে। এই প্রশ্নটিতে উল্লেখ করা হয়েছে যে লিনাক্সের ইউটিলিটির tarfileচেয়ে প্রায় দ্বিগুণ ধীর tar। আমার অভিজ্ঞতা অনুসারে এই অনুমানটি বেশ সঠিক।
সুতরাং দ্রুত সংরক্ষণাগার জন্য আপনি মডিউলটি ব্যবহার করে tarকমান্ডটি ব্যবহার করতে পারেন subprocess:
subprocess.call(['tar', '-czf', output_filename, file_to_archive])
@ আলেকসান্দ্র টুকালোর উত্তর ছাড়াও, আপনি আউটপুট এবং ত্রুটি বার্তাও পেতে পারেন (যদি দেখা যায়)। ব্যবহার করে একটি ফোল্ডার সংকোচনের tarজন্য নীচের উত্তরে বেশ ভালভাবে ব্যাখ্যা করা হয়েছে ।
import traceback
import subprocess
try:
cmd = ['tar', 'czfj', output_filename, file_to_archive]
output = subprocess.check_output(cmd).decode("utf-8").strip()
print(output)
except Exception:
print(f"E: {traceback.format_exc()}")