Wie man Teerarchive mit Python erstellt und manipuliert

Wie man Teerarchive mit Python erstellt und manipuliert

Unter Linux und anderen UNIX-ähnlichen Betriebssystemen ist TAR zweifellos eines der am häufigsten verwendeten Archivierungsversorgungsunternehmen. Es lässt uns Archive erstellen, die oft als „Tarballs“ bezeichnet werden, können wir für Quellcodeverteilung oder Sicherungszwecke verwenden. In diesem Tutorial sehen wir, wie man TAR -Archive mit Python lesen, erstellt und verändert, wobei die Tarfile Modul.

In diesem Tutorial lernen Sie:

  • Die Modi, in denen ein Teerarchiv mit dem Tarfile -Modul geöffnet werden kann
  • Was sind die Tarinfo- und Tarfile -Klassen und was sie repräsentieren?
  • So listen Sie den Inhalt eines Teerarchivs auf
  • Wie man den Inhalt eines Teerarchivs extrahiert
  • So fügen Sie Dateien zu einem Teerarchiv hinzu


Softwareanforderungen und Konventionen verwendet

Softwareanforderungen und Linux -Befehlszeilenkonventionen
Kategorie Anforderungen, Konventionen oder Softwareversion verwendet
System Verteilungsunabhängige
Software Python3
Andere Grundkenntnisse über Python3 und objektorientierte Programmierung
Konventionen # - erfordert, dass gegebene Linux -Befehle mit Root -Berechtigungen entweder direkt als Stammbenutzer oder mit Verwendung von ausgeführt werden können sudo Befehl
$ - Erfordert, dass die angegebenen Linux-Befehle als regelmäßiger nicht privilegierter Benutzer ausgeführt werden können

Grundnutzung

Der Tarfile Das Modul ist in der Python Standard Library enthalten, sodass wir es nicht separat installieren müssen. Um es zu verwenden, müssen wir es nur „importieren“. Die empfohlene Möglichkeit, mit diesem Modul auf einen Tarball zuzugreifen offen Funktion; In seiner grundlegendsten Verwendung müssen wir als erste und zweite Argumente vorlegen:

  • Der Name des Tarballs, auf den wir zugreifen möchten
  • Der Modus, in dem es geöffnet werden sollte

Der „Modus“, der zum Öffnen eines Teerarchivs verwendet wird. Lassen Sie uns sie zusammen sehen.

Öffnen eines Archivs im schreibgeschützten Modus

Wenn wir den Inhalt eines TAR-Archivs untersuchen oder extrahieren möchten, können wir einen der folgenden Modi verwenden, um ihn schreibgeschützt zu öffnen:

Modus Bedeutung
'R' Nur Lesenmodus - Der Komprimierungsart wird automatisch behandelt
'R:' Schreibgeschützter Modus ohne Kompression
'R: GZ' Schreibgeschützter Modus - Reißverschluss Komprimierung explizit angegeben
'R: BZ2' Schreibgeschützter Modus - bzip Komprimierung explizit angegeben
'R: xz' Schreibgeschützter Modus - Lzma Komprimierung explizit angegeben

In den meisten Fällen, in denen die Komprimierungsmethode leicht erkannt werden kann, ist der empfohlene Modus zu verwenden 'R'.

Öffnen eines Archivs zum Anhängen von Dateien

Wenn wir Dateien an ein vorhandenes Archiv anhängen möchten, können wir die verwenden 'A' Modus. Es ist wichtig zu bemerken, dass es möglich ist, sich nur dann an ein Archiv anzuhängen, wenn es nicht komprimiert ist. Wenn wir versuchen, ein komprimiertes Archiv mit diesem Modus zu öffnen, a ValueError Ausnahme wird erhöht. Wenn wir uns auf ein nicht existierendes Archiv beziehen, wird es im laufenden Fliegen erstellt.

Ein Archiv zum Schreiben eröffnen

Wenn wir explizit ein neues Archiv erstellen und zum Schreiben öffnen möchten, können wir einen der folgenden Modi verwenden:

Modus Bedeutung
'W' Öffnen Sie das Archiv zum Schreiben - Verwenden Sie keine Komprimierung
'W: GZ' Öffnen Sie das Archiv zum Schreiben - Verwenden Sie gzip Kompression
'W: bz' Öffnen Sie das Archiv zum Schreiben - Verwenden Sie BZIP2 Kompression
'W: xz' Öffnen Sie das Archiv zum Schreiben - Verwenden Sie Lzma Kompression

Wenn eine vorhandene Archivdatei zum Schreiben geöffnet wird, wird sie abgeschnitten, sodass alle Inhalte verworfen werden. Um solche Situationen zu vermeiden, möchten wir vielleicht das Archiv öffnen ausschließlich, Wie im nächsten Abschnitt beschrieben.

Erstellen Sie nur ein Archiv, wenn es nicht existiert

Wenn wir sicher sein möchten, dass eine vorhandene Datei beim Erstellen eines Archivs nicht überschrieben wird, müssen wir sie öffnen ausschließlich. Wenn wir das verwenden 'X' Modus und eine Datei mit demselben Namen wie der, das wir für das Archiv bereits vorgelegt haben, ist a DateiExisterror wird großgezogen. Die Komprimierungsmethoden können wie folgt angegeben werden:

Modus Bedeutung
'X' Erstellen Sie das Archiv ohne Komprimierung, wenn es nicht existiert
'x: gz' Erstellen Sie das Archiv mit gzip Komprimierung nur, wenn es nicht existiert
'x: bz2' Erstellen Sie das Archiv mit BZIP2 Komprimierung nur, wenn es nicht existiert
'x: xz' Erstellen Sie das Archiv mit Lzma Komprimierung nur, wenn es nicht existiert

Arbeiten mit Archiven

Es gibt zwei Klassen von der Tarfile Modul, das verwendet wird, um mit Teerarchiven und ihrem Inhalt zu interagieren, und sind jeweils: Tarfile Und Tarinfo. Ersteres wird verwendet, um ein Teerarchiv in seiner Gesamtheit darzustellen und kann als a verwendet werden Kontextmanager mit der Python mit Aussage, letzteres wird verwendet, um ein Archivmitglied darzustellen, und enthält verschiedene Informationen darüber. Als erster Schritt konzentrieren wir uns auf einige der am häufigsten verwendeten Methoden der Tarfile Klasse: Wir können sie verwenden, um gemeinsame Operationen auf Teerarchiven durchzuführen.

Abrufen einer Liste der Archivmitglieder

Um eine Liste der Archivmitglieder abzurufen, können wir die verwenden Getmitglieder Methode von a Tarfile Objekt. Diese Methode gibt eine Liste von zurück Tarinfo Objekte eines für jedes Archivelement. Hier ist ein Beispiel für die Verwendung mit einem dummy -komprimierten Archiv mit zwei Dateien:

>>> mit Tarfile.offenes Archiv.Teer.gz ',' r ') als Archiv: ... Archiv.Getmitglieder () ... [, ] 
Kopieren

Wie wir später sehen werden, können wir über die entsprechenden Attribute einer archivierten Datei als Besitz- und Änderungszeit zugreifen Tarinfo Objekteigenschaften und Methoden.

Anzeigen des Inhalts eines Teerarchivs

Wenn wir nur den Inhalt eines Teerarchivs anzeigen möchten, können wir ihn im Lesemodus öffnen und die verwenden Liste Methode der Tarfile Klasse.

>>> mit Tarfile.offenes Archiv.Teer.gz ',' r ') als Archiv: ... Archiv.Liste() ... ?rw-r-r-- egdoc/egdoc 0 2020-05-16 15:45:45 Datei1.txt ?rw-r-r-- egdoc/egdoc 0 2020-05-16 15:45:45 Datei2.txt 
Kopieren

Wie Sie sehen können, wird die Liste der im Archiv enthaltenen Dateien als Ausgabe angezeigt. Der Liste Die Methode akzeptiert einen Positionsparameter, ausführlich welches ist WAHR standardmäßig. Wenn wir seinen Wert an ändern, um FALSCH, In der Ausgabe werden nur die Dateinamen ohne zusätzliche Informationen gemeldet.

Die Methode akzeptiert auch einen optionalen benannten Parameter, Mitglieder. Bei Verwendung muss das angegebene Argument eine Teilmenge der Liste von sein Tarinfo Objekte, die von der zurückgegeben werden Getmitglieder Methode. Es werden nur Informationen zu den angegebenen Dateien angezeigt, wenn dieser Parameter verwendet wird und ein korrekter Wert bereitgestellt wird.

Extrahieren Sie alle Mitglieder aus dem Teerarchiv

Eine weitere sehr häufige Operation, die wir vielleicht in einem Teerarchiv ausführen möchten, besteht darin, alle seine Inhalte zu extrahieren. Um einen solchen Vorgang auszuführen, können wir die verwenden alles extrahierenMethode der entsprechenden Methode Tarfile Objekt. Hier ist, was wir schreiben würden:

>>> mit Tarfile.offenes Archiv.Teer.gz ',' r ') als Archiv: ... Archiv.alles extrahieren() 
Kopieren

Der erste von der Methode akzeptierte Parameter ist Weg: Es wurde früher angegeben, wo die Mitglieder des Archivs extrahiert werden sollen. Der Standardwert ist ''.'', Die Mitglieder werden also im aktuellen Arbeitsverzeichnis extrahiert.

Der zweite Parameter, Mitglieder, kann verwendet werden, um eine Teilmenge von Mitgliedern anzugeben, um aus dem Archiv zu extrahieren, und wie im Fall des Liste Methode sollte eine Teilmenge der von der zurückgegebenen Liste sein Getmitglieder Methode.

Der alles extrahieren Die Methode hat auch einen benannten Parameter, numeric_owner. Es ist FALSCH standardmäßig: Wenn wir es ändern WAHR, numerisch uid Und gid wird verwendet, um das Eigentum an den extrahierten Dateien anstelle von Benutzer- und Gruppennamen festzulegen.

Nur ein Mitglied aus dem Archiv extrahieren

Was ist, wenn wir nur eine einzige Datei aus dem Archiv extrahieren möchten?? In diesem Fall wollen wir die verwenden Extrakt Methode und Verweisen Sie auf die Datei, die durch ihre extrahiert werden sollte Name (oder als Tarfile Objekt). Zum Beispiel nur das extrahieren Datei1.txt Datei aus dem Tarball würden wir ausführen:

>>> mit Tarfile.offenes Archiv.Teer.gz ',' r ') als Archiv: ... Archiv.extrahieren ('Datei1.txt') 
Kopieren

Einfach, nicht wahr?? Die Datei wird standardmäßig im aktuellen Arbeitsverzeichnis extrahiert, aber eine andere Position kann unter Verwendung des von der Methode akzeptierten zweiten Parameters angegeben werden: Weg.

Normalerweise werden die Attribute, die die Datei im Archiv hat, festgelegt, wenn sie auf dem Dateisystem extrahiert wird. Um dieses Verhalten zu vermeiden, können wir den dritten Parameter der Funktion festlegen, set_attrs, Zu FALSCH.

Die Methode akzeptiert auch die numeric_owner Parameter: Die Verwendung ist die gleiche, die wir im Kontext der gesehen haben alles extrahieren Methode.

Extrahieren eines Archivelements als fileähnliche Objekt

Wir haben gesehen, wie, indem wir die benutzten alles extrahieren Und Extrakt Methoden Wir können ein oder mehrere Teerarchivmitglieder in das Dateisystem extrahieren. Der Tarfile Das Modul bietet eine weitere Extraktionsmethode: Datei extrahieren. Wenn diese Methode verwendet wird, wird die angegebene Datei nicht an das Dateisystem extrahiert. Stattdessen wird ein schreibgeschütztes Datei-ähnliches Objekt, das es darstellt, zurückgegeben:

>>> mit Tarfile.offenes Archiv.Teer.gz ',' r ') als Archiv: ... FileObj = Archiv.ExtractFile ('Datei1.txt') ... fileObj.schreibbar() ... fileObj.lesen() ... Falsches B'hello \ nworld \ n ' 
Kopieren

Hinzufügen von Dateien zu einem Archiv

Bisher haben wir gesehen, wie wir Informationen über ein Archiv und seine Mitglieder und die verschiedenen Methoden erhalten, mit denen wir seinen Inhalt extrahieren können. Jetzt ist es Zeit zu sehen, wie wir neue Mitglieder hinzufügen können.

Der einfachste Weg, wie wir eine Datei zu einem Archiv hinzufügen können, besteht darin, die Verwendung des hinzufügen Methode. Wir verweisen auf die Datei, die in das Archiv aufgenommen werden soll Name, Dies ist der erste Parameter, der von der Methode akzeptiert wird. Die Datei wird mit ihrem ursprünglichen Namen archiviert, es sei denn, wir geben einen alternativen an, unter Verwendung des zweiten Positionsparameters: Arcname. Angenommen, wir wollen das hinzufügen Datei1.txt zu einem neuen Archiv, aber wir wollen es als lagern als archivived_file1.txt; Wir würden schreiben:

>>> mit Tarfile.öffnen ('new_archive.Teer.gz ',' w ') als Archiv: ... Archiv.add ('Datei1.txt ',' archived_file1.txt') ... Archiv.Liste() ... -rw-r-r-- egdoc/egdoc 12 2020-05-16 17:49:44 Archived_file1.txt 
Kopieren

Im obigen Beispiel haben wir ein neues unkomprimiertes Archiv mit dem erstellt 'W' Modus und fügte die hinzu Datei1.txt als archive_file1.txt, Wie Sie durch die Ausgabe von sehen können Liste().

Verzeichnisse können auf die gleiche Weise archiviert werden: Standardmäßig werden die rekursiv hinzugefügt, so dass zusammen mit ihrem Inhalt zusammen. Dieses Verhalten kann geändert werden, indem der von der akzeptierte dritte Positionsparameter festgelegt wird hinzufügen Methode, rekursiv, Zu FALSCH.

Was ist, wenn wir einen Filter anwenden möchten, damit nur bestimmte Dateien im Archiv enthalten sind? Zu diesem Zweck können wir das optionale verwenden Filter Parameter benannt. Der an diesen Parameter übergebene Wert muss eine Funktion sein, die a nimmt Tarinfo Objekt als Argument und gibt das Objekt zurück, wenn es in das Archiv aufgenommen werden muss oder Keiner Wenn es ausgeschlossen werden muss. Lassen Sie uns ein Beispiel sehen. Angenommen, wir haben drei Dateien in unserem aktuellen Arbeitsverzeichnis: Datei1.txt, Datei2.txt Und Datei1.md. Wir möchten nur die Dateien mit dem hinzufügen .txt Erweiterung des Archivs; Hier ist, was wir schreiben könnten:

>>> import OS >>> TARFILE >>> mit Tarfile.öffnen ('new_archive.Teer.gz ',' w ') als Archiv: ... denn ich in OS.ListDir (): ... Archiv.add (i, filter = lambda x: x wenn x.Name.endet mit('.txt ') sonst keine) ... Archiv.Liste() ... -rw-r-r-- egdoc/egdoc 0 2020-05-16 18:26:20 Datei2.txt -rw-r-r-- egdoc/egdoc 0 2020-05-16 18:22:13 Datei1.txt 
Kopieren

Im obigen Beispiel haben wir die verwendet Betriebssystem.Listdir Methode, um eine Liste der Dateien zu erhalten, die im aktuellen Arbeitsverzeichnis enthalten sind. Über diese Liste iteriert, verwendeten wir die hinzufügen Methode, um jede Datei dem Archiv hinzuzufügen. Wir haben eine Funktion als Argument der Filter Parameter, in diesem Fall eine anonyme, a Lambda. Die Funktion nimmt das Tarfile -Objekt als Argument (x) und gibt es zurück, wenn sein Name (Name ist eine der Eigenschaften der Eigenschaften des Tarinfo Objekt) endet mit “.txt". Wenn es nicht der Fall ist, kehrt die Funktion zurück Keiner Die Datei ist also nicht archiviert.

Das Tarinfo -Objekt

Wir haben bereits gelernt, dass die Tarinfo Objekte stellen ein TAR -Archivmitglied dar: Es speichert die Attribute der referenzierten Datei und bietet einige Methoden, mit denen wir den Dateityp selbst identifizieren können. Der Tarinfo Objekt enthält nicht die tatsächlichen Dateidaten. Einige der Attribute der Tarinfo Objekt sind:

  • Name (Name der Datei)
  • Größe (Dateigröße)
  • mtime (Dateimodifikationszeit)
  • UID (die Benutzer -ID des Dateibesitzers)
  • GID (die ID der Dateigruppe)
  • Uname (der Benutzername des Dateibesitzers)
  • gname (der Name der Dateigruppe)

Das Objekt hat auch einige sehr nützliche Methoden, hier sind einige von ihnen:

  • isFile () - Gibt true zurück, wenn die Datei eine reguläre Datei ist, sonst falsch falsch
  • isdir () - Gibt true zurück, wenn die Datei ein Verzeichnis ist, sonst falsch falsch
  • ISSYM () - Gibt true zurück, wenn die Datei ein symbolischer Link ist, sonst falsch falsch
  • isblk () - Gibt true zurück, wenn die Datei ein Blockgerät ist, sonst falsch falsch

Schlussfolgerungen

In diesem Tutorial haben wir die grundlegende Verwendung des Tarfile Python -Modul, und wir haben gesehen, wie wir es verwenden können, um mit Teerarchiven zu arbeiten. Wir haben die verschiedenen Betriebsmodi gesehen, was die Tarfile Und Tarinfo Die Klassen repräsentieren und einige der am häufigsten verwendeten Methoden, um den Inhalt eines Archivs aufzulisten, neue Dateien hinzuzufügen oder sie zu extrahieren. Für ein ausführlicheres Wissen über die Tarfile Modul Bitte sehen Sie sich die offizielle Moduldokumentation an

Verwandte Linux -Tutorials:

  • Eine Einführung in Linux -Automatisierung, Tools und Techniken
  • Dinge zu installieren auf Ubuntu 20.04
  • Mastering -Bash -Skriptschleifen beherrschen
  • Dinge zu tun nach der Installation Ubuntu 20.04 fokale Fossa Linux
  • Verschachtelte Schleifen in Bash -Skripten
  • Ubuntu 22.04 Systemsicherung und Wiederherstellung
  • Mint 20: Besser als Ubuntu und Microsoft Windows?
  • So erstellen Sie inkrementelle und differentielle Backups mit Teer
  • So erstellen und extrahieren Sie CPIO -Archive an Linux -Beispielen
  • Einführung in Borg Backup