كيف يمكن إضافة الملفات إلى Tarfile مع Python، دون إضافة التسلسل الهرمي الدليل؟

StackOverflow https://stackoverflow.com/questions/2239655

  •  19-09-2019
  •  | 
  •  

سؤال

عندما دعني 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"])
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top