Wie man Teerarchive mit Python erstellt und manipuliert
- 4707
- 1007
- Aileen Dylus
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
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 extrahieren
Methode 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