Hoe kunnen bestanden worden toegevoegd aan een tar-bestand met Python, zonder de directoryhiërarchie toe te voegen?

Als ik add()aanroep op een tarfileobject met een bestandspad, wordt het bestand toegevoegd aan de tarball met bijbehorende directoryhiërarchie. Met andere woorden, als ik de tarfile uitpak, worden de mappen in de oorspronkelijke mappenhiërarchie gereproduceerd.

Is er een manier om eenvoudig een gewoon bestand toe te voegen zonder directory-info, waardoor de resulterende tarball een platte lijst met bestanden oplevert?


Antwoord 1, autoriteit 100%

Het gebruik van het argument arcnamevan de TarFile.add()-methode is een alternatieve en handige manier om uw bestemming te vinden.

Voorbeeld: je wilt een dir repo/a.git/archiveren naar een tar.gzbestand, maar je wilt liever dat de boomstam in het archief begint met a.git/maar niet repo/a.git/, je kunt het volgende doen:

archive = tarfile.open("a.git.tar.gz", "w|gz")
archive.add("repo/a.git", arcname="a.git")
archive.close()

Antwoord 2, autoriteit 61%

U kunt tarfile.addfile(), in het TarInfo-object , wat de eerste parameter is, kunt u een nameopgeven die verschilt van het bestand dat u toevoegt.

Dit stukje code moet /path/to/filenametoevoegen aan het TAR-bestand, maar zal het uitpakken als myfilename:

tar.addfile(tarfile.TarInfo("myfilename.txt"), open("/path/to/filename.txt"))

Antwoord 3, autoriteit 6%

Misschien kunt u het argument “arcname” gebruiken voor TarFile.add(name, arcname). Er is een alternatieve naam voor nodig die het bestand in het archief zal hebben.


Antwoord 4, autoriteit 3%

dankzij @diabloneo, functie om selectieve tarball van een dir te maken

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"])

Antwoord 5

Als u de naam van de map wilt toevoegen, maar niet de inhoud ervan in een tar-bestand, kunt u het volgende doen:

(1) maak een lege map aan met de naam empty
(2) tf.add("empty", arcname=path_you_want_to_add)

Dat creëert een lege map met de naam path_you_want_to_add.

Other episodes