পাইথন ব্যবহার করে কীভাবে সম্পূর্ণ সংকুচিত টার ফাইল তৈরি করবেন?


107

পাইথনে সংকোচনের সাথে আমি কীভাবে একটি .tar.gz ফাইল তৈরি করতে পারি?


16
tar তথ্য সংকোচন করে না, এটি কেবল ফাইলগুলি একসাথে প্যাক করে। এটি জিজিপ যা আসল সংকোচনের কাজ করে।
Ignacio Vazquez-Abram

উত্তর:


186

একটি সম্পূর্ণ ডিরেক্টরি গাছের জন্য একটি .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


31
পাঠকদের কাছে ঠিক যেমন একটি নোট, যদি আপনি এটি ছেড়ে যান arcname=os.path.basename(source_dir)তবে এটি আপনাকে source_dirটার ফাইলের পুরো পথ কাঠামোটি দেবে (বেশিরভাগ ক্ষেত্রে, এটি সম্ভবত অসুবিধাগ্রস্থ)।
ব্রুটসর্ফুজথ্রিক্স

12
একটি দ্বিতীয় নোট; arcname=os.path.basename(source_dir)এখনও ব্যবহারের অর্থ সংরক্ষণাগারটিতে এমন একটি ফোল্ডার রয়েছে যা এর সামগ্রীগুলি অন্তর্ভুক্ত করে source_dir। আপনি যদি সংরক্ষণাগারটির মূলটি কোনও ফোল্ডারে থাকা সামগ্রীগুলি না রেখে নিজেই সংরক্ষণ করতে চান তবে arcname=os.path.sepপরিবর্তে ব্যবহার করুন।
জোনাথন এইচ

2
@ শেলজাহান দুর্ভাগ্যক্রমে, এটি পুরোপুরি সঠিক নয়, কারণ যদি কেউ এটি ব্যবহার করে os.path.sepতবে সংরক্ষণাগারটিতে পরিষেবা থাকবে ""। বা "/" ফোল্ডার যা সাধারণত কোনও সমস্যা হয় না, তবে আপনি পরে এই আর্কাইভটিকে প্রোগ্রামগতভাবে প্রক্রিয়াজাত করে যদি কখনও কখনও এটি কোনও সমস্যা হতে পারে। os.walkপৃথকভাবে ফাইলগুলি করা এবং যুক্ত করার একমাত্র আসল পরিষ্কার উপায় বলে মনে হচ্ছে
দ্য

সমস্ত ডিরেক্টরি কাঠামো থেকে মুক্তি পেতে কেবল ব্যবহার করুন arcname='.'। ব্যবহার করার দরকার নেই os.walk
এডওয়ার্ডারন

85
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" দিয়ে প্রতিস্থাপন করুন।


10
with tarfile.open( ..কল openএবং closeম্যানুয়ালি পরিবর্তে আপনার পাইথনটিতে সত্যই ব্যবহার করা উচিত । নিয়মিত ফাইলগুলি খোলার সময় এটিও ঘটে।
জোনাথন এইচ

31

আপনি তারফিল.ওপেনকে কল করেছেন mode='w:gz', যার অর্থ " জিজিপ সংক্ষেপিত লেখার জন্য উন্মুক্ত"।

আপনি সম্ভবত ফাইলের নামটি দিয়ে ( nameযুক্তিটি দিয়ে open) শেষ করতে চাইবেন .tar.gzতবে এটি সংকোচনের ক্ষমতাগুলিকে প্রভাবিত করে না।

বিটিডাব্লু, আপনি সাধারণত একটি মোডের সাথে আরও ভাল সংক্ষেপণ পান 'w:bz2', ঠিক tarতেমনভাবে bzip2এটি সংকোচনের চেয়ে আরও ভাল সংকোচন করতে পারে gzip


6
কেবলমাত্র একটি দ্রষ্টব্য নোট যে bzip2- সংকুচিত টার্বলগুলির ফাইলের নামটি ".tar.bz2" দিয়ে শেষ হওয়া উচিত।
Ignacio Vazquez-Abram

8

পূর্ববর্তী উত্তরগুলি tarfileপাইথনে একটি .tar.gzফাইল তৈরি করার জন্য পাইথন মডিউলটি ব্যবহার করার পরামর্শ দেয় । এটি স্পষ্টতই একটি ভাল এবং পাইথন-শৈলীর সমাধান, তবে এটি সংরক্ষণাগারটির গতিতে গুরুতর অসুবিধা রয়েছে। এই প্রশ্নটিতে উল্লেখ করা হয়েছে যে লিনাক্সের ইউটিলিটির tarfileচেয়ে প্রায় দ্বিগুণ ধীর tar। আমার অভিজ্ঞতা অনুসারে এই অনুমানটি বেশ সঠিক।

সুতরাং দ্রুত সংরক্ষণাগার জন্য আপনি মডিউলটি ব্যবহার করে tarকমান্ডটি ব্যবহার করতে পারেন subprocess:

subprocess.call(['tar', '-czf', output_filename, file_to_archive])

0

এই tar.gz ফাইলটি ওপেন ভিউ ডিরেক্টরিতে সংকোচনের জন্য os.path.basename (file_directory) ব্যবহার করুন

with tarfile.open("save.tar.gz","w:gz"):
      for file in ["a.txt","b.log","c.png"]:
           tar.add(os.path.basename(file))

ডিরেক্টরিতে tar.gz ফাইল সংক্ষেপে এটির ব্যবহার


0

@ আলেকসান্দ্র টুকালোর উত্তর ছাড়াও, আপনি আউটপুট এবং ত্রুটি বার্তাও পেতে পারেন (যদি দেখা যায়)। ব্যবহার করে একটি ফোল্ডার সংকোচনের 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()}")       
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.