كيف يمكن إضافة الملفات إلى Tarfile مع Python، دون إضافة التسلسل الهرمي الدليل؟
سؤال
عندما دعني add()
على tarfile
كائن مع مسار الملف، يتم إضافة الملف إلى Tarball مع التسلسل الهرمي الدليل المرتبط به. بمعنى آخر، إذا قمت بفك الضغط على الدلائل في الدلائل الأصلية يتم استنساخ التسلسل الهرمي.
هل هناك طريقة لإضافتها ببساطة ملف عادي دون معلومات الدليل التي تنتج Tarball الناتجة عن قائمة مسطحة من الملفات؟
المحلول
يمكنك استخدام tarfile.addfile()
, ، في ال TarInfo
الكائن، وهو المعلمة الأولى، يمكنك تحديد name
هذا يختلف عن الملف الذي تضيفه.
يجب أن تضيف هذه القطعة من التعليمات /path/to/filename
إلى ملف القطران ولكن سوف استخراجها myfilename
:
tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))
نصائح أخرى
ال قوس طريقة Tarfile.add () طريقة بديلة ومريحة لتتناسب مع وجهتك.
مثال: تريد أرشفة دير repo / a.git / إلى أ tar.gz. ملف، ولكنك تريد أن تبدأ جذر الشجرة في الأرشيف جي / لكن لا repo / a.git /, ، يمكنك أن تفعل مثل ما يلي:
archive = tarfile.open("a.git.tar.gz", "w|gz")
archive.add("repo/a.git", arcname="a.git")
archive.close()
ربما يمكنك استخدام وسيطة "ArcName" إلى Tarfile.add (الاسم، ArcName). يستغرق اسم بديل أن الملف سيكون داخل الأرشيف.
بفضل diabloneo، وظيفة لإنشاء تاربار انتقائي من دير
def compress(output_file="archive.tar.gz", output_dir='', root_dir='.', items=[]):
"""compress dirs.
KWArgs
------
output_file : str, default ="archive.tar.gz"
output_dir : str, default = ''
absolute path to output
root_dir='.',
absolute path to input root dir
items : list
list of dirs/items relative to root dir
"""
os.chdir(root_dir)
with tarfile.open(os.path.join(output_dir, output_file), "w:gz") as tar:
for item in items:
tar.add(item, arcname=item)
>>>root_dir = "/abs/pth/to/dir/"
>>>compress(output_file="archive.tar.gz", output_dir=root_dir,
root_dir=root_dir, items=["logs", "output"])