2010-02-10 6 views
33

Wenn ich add() auf einem tarfile Objekt mit einem Dateipfad aufrufen, wird die Datei dem Tarball mit verknüpfter Verzeichnishierarchie hinzugefügt. Mit anderen Worten, wenn ich die TAR-Datei entzippe, werden die Verzeichnisse in der ursprünglichen Verzeichnishierarchie wiedergegeben.Wie können Dateien zu einer Tarfile mit Python hinzugefügt werden, ohne die Verzeichnishierarchie hinzuzufügen?

Gibt es eine Möglichkeit, einfach eine einfache Datei ohne Verzeichnisinformationen hinzuzufügen, die den resultierenden Tarball entpackt, um eine flache Liste von Dateien zu erzeugen?

Antwort

32

Sie können tarfile.addfile() verwenden, im Objekt TarInfo, das der erste Parameter ist, können Sie eine name angeben, die sich von der Datei unterscheidet, die Sie hinzufügen.

sollte Dieses Stück Code /path/to/filename an die TAR-Datei hinzufügen, aber es als myfilename extrahieren:

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

auch es funktioniert auch für 'tar.add()'! Um einen ganzen Baum, aber mit einem anderen Namen, hinzuzufügen, tun Sie einfach: 'tar.add ('/ Pfad/zu/Verzeichnis/zu/hinzufügen /', ArcName = 'NewDirname')' und dann wird die TAR-Datei ein Verzeichnis mit dem Namen enthalten 'newdirname', und mit allen Inhalten unberührt. –

+3

Und wenn Sie die Dateien ohne die gesamte Verzeichnisstruktur speichern möchten. do 'arcname = '.'' –

+0

Was ist diese Datei() Funktion? Wie man es importiert? –

5

Vielleicht können Sie verwenden, um die "arcname" Argument TarFile.add (Name, arcname). Es benötigt einen alternativen Namen, den die Datei im Archiv haben wird.

48

Die arch Argument der TarFile.add() -Methode ist eine alternative und bequeme Möglichkeit, Ihr Ziel zu entsprechen.

Beispiel: Sie wollen ein Verzeichnis Repo-/a.git/ zu einer tar.gz Datei zu archivieren, aber Sie lieber die Baumwurzel wollen in das Archiv von a.git beginnt/ aber nicht Repo-/a.git/, können Sie wie folgenden tun:

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

Einfacher als die akzeptierte Antwort IMHO –

+0

Dies ist ein besserer Ansatz, da die angenommene Antwort nicht funktioniert, wenn Sie versuchen, Verzeichnisse hinzuzufügen. –

Verwandte Themen