Comment créer et manipuler les archives TAR à l'aide de Python
- 5004
- 384
- Romain Martinez
Sur Linux et d'autres systèmes d'exploitation de type Unix, le TAR est sans aucun doute l'un des utilitaires d'archivage les plus utilisés; Il nous a permis de créer des archives, souvent appelées «tarballs», nous pouvons utiliser à des fins de distribution de code source ou de sauvegarde. Dans ce tutoriel, nous verrons comment lire, créer et modifier les archives TAR avec Python, en utilisant le tarfil
module.
Dans ce tutoriel, vous apprendrez:
- Les modes dans lesquels une archive TAR peut être ouverte à l'aide du module TarFile
- Quelles sont les classes tarinfo et tarfile et ce qu'ils représentent
- Comment énumérer le contenu d'une archive TAR
- Comment extraire le contenu d'une archive TAR
- Comment ajouter des fichiers à une archive TAR
Exigences et conventions logicielles utilisées
Catégorie | Exigences, conventions ou version logicielle utilisée |
---|---|
Système | Indépendant de la distribution |
Logiciel | Python3 |
Autre | Connaissance de base de Python3 et de la programmation orientée objet |
Conventions | # - Exige que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande$ - Exige que les commandes Linux soient exécutées en tant qu'utilisateur non privilégié régulier |
Utilisation de base
Le tarfil Le module est inclus dans la bibliothèque standard Python, nous n'avons donc pas besoin de l'installer séparément; Pour l'utiliser, nous avons juste besoin de «l'importer». Le moyen recommandé d'accéder à un tarball en utilisant ce module est par le ouvrir
fonction; Dans son utilisation la plus élémentaire, nous devons fournir, comme premier et deuxième argument:
- Le nom du tarball auquel nous voulons accéder
- Le mode dans lequel il doit être ouvert
Le «mode» utilisé pour ouvrir une archive TAR dépend de l'action que nous voulons effectuer et du type de compression (le cas échéant) utilisé. Voyons-les ensemble.
Ouverture d'une archive en mode en lecture seule
Si nous voulons examiner ou extraire le contenu d'une archive TAR, nous pouvons utiliser l'un des modes suivants, pour l'ouvrir en lecture seule:
Mode | Signification |
---|---|
'R' | Mode de lecture uniquement - Le type de compression sera automatiquement géré |
'R:' | Mode en lecture seule sans compression |
'r: gz' | Mode en lecture seule - zipper compression explicitement spécifiée |
'r: bz2' | Mode en lecture seule - bzip compression explicitement spécifiée |
'r: xz' | Mode en lecture seule - LZMA compression explicitement spécifiée |
Dans la plupart des cas, où la méthode de compression peut être facilement détectée, le mode recommandé à utiliser est 'R'.
Ouverture d'une archive pour ajouter des fichiers
Si nous souhaitons ajouter des fichiers à une archive existante, nous pouvons utiliser le 'un' mode. Il est important de remarquer qu'il est possible de ajouter à une archive uniquement s'il n'est pas compressé; Si nous essayons d'ouvrir une archive compressée avec ce mode, un Value Enerror
une exception sera soulevée. Si nous faisons référence à une archive inexistante, elle sera créée à la volée.
Ouverture d'une archive pour l'écriture
Si nous voulons créer explicitement une nouvelle archive et l'ouvrir à l'écriture, nous pouvons utiliser l'un des modes suivants:
Mode | Signification |
---|---|
'W' | Ouvrez les archives pour l'écriture - n'utilisez aucune compression |
'W: gz' | Ouvrez les archives pour l'écriture - Utiliser gzip compression |
'W: bz' | Ouvrez les archives pour l'écriture - Utiliser bzip2 compression |
'W: xz' | Ouvrez les archives pour l'écriture - Utiliser LZMA compression |
Si un fichier d'archive existant est ouvert pour l'écriture, il est tronqué, donc tout son contenu est jeté. Pour éviter de telles situations, nous voulons peut-être ouvrir les archives exclusivement, Comme décrit dans la section suivante.
Créer une archive uniquement si elle n'existe pas
Lorsque nous voulons être sûrs qu'un fichier existant n'est pas remplacé lors de la création d'une archive, nous devons l'ouvrir exclusivement. Si nous utilisons le 'X' mode et fichier avec le même nom de celui que nous avons spécifié pour l'archive existe déjà, un FileExisterSerror
sera soulevé. Les méthodes de compression peuvent être spécifiées comme suit:
Mode | Signification |
---|---|
'X' | Créez l'archive sans compression s'il n'existe pas |
'x: gz' | Créer l'archive avec gzip compression uniquement s'il n'existe pas |
'x: bz2' | Créer l'archive avec bzip2 compression uniquement s'il n'existe pas |
'x: xz' | Créer l'archive avec LZMA compression uniquement s'il n'existe pas |
Travailler avec les archives
Il y a deux classes fournies par le tarfil
Module qui est utilisé pour interagir avec les archives TAR et leur contenu, et sont respectivement: Tarfil
et Tarinfo
. Le premier est utilisé pour représenter une archive de goudron dans son intégralité et peut être utilisé comme un gestionnaire de contexte avec le python avec
déclaration, ce dernier est utilisé pour représenter un membre des archives et contient diverses informations à ce sujet. Dans une première étape, nous nous concentrerons sur certaines des méthodes les plus souvent utilisées Tarfil
Classe: Nous pouvons les utiliser pour effectuer des opérations communes sur les archives TAR.
Récupération d'une liste des membres des archives
Pour récupérer une liste des membres de l'archive, nous pouvons utiliser le GetMembers
Méthode de A Tarfil
objet. Cette méthode renvoie une liste de Tarinfo
objets, un pour chaque membre de l'archive. Voici un exemple de son utilisation avec une archive comprimée factice contenant deux fichiers:
>>> avec Tarfile.Archives ouvertes.le goudron.gz ',' r ') comme archive: ... archive.getMembers () ... [, ]]
Copie Comme nous le verrons plus loin, nous pouvons accéder à certains des attributs d'un fichier archivé, comme le temps de propriété et de modification, via le correspondant Tarinfo
Propriétés et méthodes des objets.
Affichage du contenu d'une archive TAR
Si tout ce que nous voulons faire est d'afficher le contenu d'une archive TAR, nous pouvons l'ouvrir en mode lecture et utiliser le liste
Méthode de la Tarfil
classe.
>>> avec Tarfile.Archives ouvertes.le goudron.gz ',' r ') comme archive: ... archive.liste() ... ?RW-R - r-- Egdoc / Egdoc 0 2020-05-16 15:45:45 Fichier1.SMS ?RW-R --R-- EGDOC / EGDOC 0 2020-05-16 15:45:45 Fichier2.SMS
Copie Comme vous pouvez le voir, la liste des fichiers contenus dans l'archive s'affiche sous forme de sortie. Le liste
La méthode accepte un paramètre positionnel, verbeux lequel est Vrai
par défaut. Si nous modifions sa valeur en FAUX
, Seuls les noms de fichiers seront signalés dans la sortie, sans informations supplémentaires.
La méthode accepte également un paramètre nommé facultatif, membres. S'il est utilisé, l'argument fourni doit être un sous-ensemble de la liste de Tarinfo
objets retournés par le GetMembers
méthode. Seules des informations sur les fichiers spécifiés seront affichées si ce paramètre est utilisé et qu'une valeur correcte est fournie.
Extraction de tous les membres des archives TAR
Une autre opération très courante que nous voulons peut-être effectuer sur une archive de goudron est d'extraire tout son contenu. Pour effectuer une telle opération, nous pouvons utiliser le extraire tout
Méthode du correspondant Tarfil
objet. Voici ce que nous écrivions:
>>> avec Tarfile.Archives ouvertes.le goudron.gz ',' r ') comme archive: ... archive.extraire tout()
Copie Le premier paramètre accepté par la méthode est chemin: il était utilisé pour spécifier où les membres de l'archive doivent être extraits. La valeur par défaut est '.'
, Les membres sont donc extraits dans le répertoire de travail actuel.
Le deuxième paramètre, membres, peut être utilisé pour spécifier un sous-ensemble de membres à extraire de l'archive et, comme dans le cas du liste
Méthode, ce devrait être un sous-ensemble de la liste renvoyée par le GetMembers
méthode.
Le extraire tout
La méthode a également un paramètre nommé, NUMÉRIQUE. C'est FAUX
Par défaut: si nous le modifions en Vrai
, numérique uid et gid sera utilisé pour définir la propriété des fichiers extraits au lieu des noms d'utilisateur et de groupe.
Extraction d'un seul membre des archives
Et si nous voulons extraire un seul fichier de l'archive? Dans ce cas, nous voulons utiliser le extrait
Méthode et référencer le fichier qui doit être extrait par son nom (ou en tant que Tarfil
objet). Par exemple, pour extraire uniquement le fichier1.SMS
dossier du tarball, nous courions:
>>> avec Tarfile.Archives ouvertes.le goudron.gz ',' r ') comme archive: ... archive.Extrait ('Fichier1.SMS')
Copie Facile, n'est-ce pas? Le fichier est extrait par défaut sur le répertoire de travail actuel, mais une position différente peut être spécifiée en utilisant le deuxième paramètre accepté par la méthode: chemin.
Normalement, les attributs du fichier à l'intérieur de l'archive sont définis lorsqu'il est extrait sur le système de fichiers; Pour éviter ce comportement, nous pouvons définir le troisième paramètre de la fonction, set_attrs, pour FAUX
.
La méthode accepte également le NUMÉRIQUE Paramètre: l'utilisation c'est la même chose que nous avons vue dans le contexte du extraire tout
méthode.
Extraction d'un membre d'archives comme objet de type fichier
Nous avons vu comment, en utilisant le extraire tout
et extrait
Méthodes Nous pouvons extraire un ou plusieurs membres d'archive TAR au système de fichiers. Le tarfil
Le module fournit une autre méthode d'extraction: extraire le fichier
. Lorsque cette méthode est utilisée, le fichier spécifié n'est pas extrait au système de fichiers; Au lieu de cela, un objet de type fichier en lecture seule le représentant est renvoyé:
>>> avec Tarfile.Archives ouvertes.le goudron.gz ',' r ') comme archive: ... fileoBj = archive.ExtractFile ('File1.SMS') ... fileobj.Writable () ... fileobj.lire() ... Faux b'hello \ nworld \ n '
Copie Ajout de fichiers à une archive
Jusqu'à présent, nous voyons comment obtenir des informations sur une archive et ses membres, et les différentes méthodes que nous pouvons utiliser pour extraire son contenu; Maintenant, il est temps de voir comment nous pouvons ajouter de nouveaux membres.
La façon la plus simple que nous puissions utiliser pour ajouter un fichier à une archive est d'utiliser le ajouter
méthode. Nous référentes le fichier à inclure dans l'archive par nom, qui est le premier paramètre accepté par la méthode. Le fichier sera archivé avec son nom d'origine, sauf si nous en spécifions un alternatif en utilisant le deuxième paramètre de position: nom d'arcn. Supposons que nous voulons ajouter le fichier1.SMS
à une nouvelle archive, mais nous voulons le stocker comme archivé_file1.SMS
; Nous écrivions:
>>> avec Tarfile.Open ('new_archive.le goudron.gz ',' w ') comme archive: ... archive.ajouter ('fichier1.txt ',' archived_file1.SMS') ... archive.liste() ... -RW-R --R-- Egdoc / Egdoc 12 2020-05-16 17:49:44 Archived_file1.SMS
Copie Dans l'exemple ci-dessus, nous avons créé une nouvelle archive non compressée en utilisant le 'W' mode et ajouter le fichier1.SMS
comme archive_file1.SMS
, Comme vous pouvez le voir par la sortie de liste()
.
Les répertoires peuvent être archivés de la même manière: par défaut, ils sont ajoutés récursivement, donc avec leur contenu. Ce comportement peut être modifié en définissant le troisième paramètre positionnel accepté par le ajouter
méthode, récursif, pour FAUX
.
Et si nous voulons appliquer un filtre, afin que seuls les fichiers spécifiés soient inclus dans l'archive? À cette fin, nous pouvons utiliser le facteur filtre paramètre nommé. La valeur transmise à ce paramètre doit être une fonction qui prend un Tarinfo
objet comme argument et renvoie ledit objet s'il doit être inclus dans l'archive ou Aucun
S'il doit être exclu. Voyons un exemple. Supposons que nous ayons trois fichiers dans notre répertoire de travail actuel: fichier1.SMS
, fichier2.SMS
et fichier1.Maryland
. Nous voulons ajouter uniquement les fichiers avec le .SMS
extension des archives; Voici ce que nous pourrions écrire:
>>> Importer OS >>> Importer Tarfile >>> avec Tarfile.Open ('new_archive.le goudron.gz ',' w ') comme archive: ... Pour je dans OS.listDir (): ... archive.ajouter (i, filter = lambda x: x si x.nom.se termine par('.txt ') sinon aucun) ... archive.liste() ... -RW-R --R-- EGDOC / EGDOC 0 2020-05-16 18:26:20 Fichier2.txt -rw-r - r-- egdoc / egdoc 0 2020-05-16 18:22:13 Fichier1.SMS
Copie Dans l'exemple ci-dessus, nous avons utilisé le OS.listdir
Méthode pour obtenir une liste des fichiers contenus dans le répertoire de travail actuel. Itérer sur cette liste, nous avons utilisé le ajouter
Méthode pour ajouter chaque fichier à l'archive. Nous avons passé une fonction comme l'argument du filtre paramètre, dans ce cas un anonyme, un lambda. La fonction prend l'objet TarFile comme argument (x) et le renvoie si son nom (le nom est l'une des propriétés du Tarinfo
objet) se termine par «.SMS". Si ce n'est pas le cas, la fonction renvoie Aucun
donc le fichier n'est pas archivé.
L'objet tarinfo
Nous avons déjà appris que le Tarinfo
Les objets représentent un membre d'archives TAR: il stocke les attributs du fichier référencé et fournit des méthodes qui peuvent nous aider à identifier le type de fichier lui-même. Le Tarinfo
L'objet ne contient pas les données de fichier réelles. Certains des attributs du Tarinfo
Les objets sont:
- nom (nom du fichier)
- taille (taille du fichier)
- mtime (temps de modification du fichier)
- UID (l'ID utilisateur du propriétaire du fichier)
- GID (l'ID du groupe de fichiers)
- Uname (le nom d'utilisateur du propriétaire du fichier)
- GNAME (le nom du groupe de fichiers)
L'objet a également quelques méthodes très utiles, en voici quelques-unes:
- isFile () - Renvoie True si le fichier est un fichier régulier, faux sinon
- isdir () - renvoie true si le fichier est un répertoire, faux sinon
- issyM () - Renvoie True si le fichier est un lien symbolique, faux sinon
- ISBLK () - Renvoie True si le fichier est un périphérique de bloc, faux sinon
Conclusions
Dans ce tutoriel, nous avons appris l'utilisation de base du tarfil
Module Python, et nous avons vu comment nous pouvons l'utiliser pour travailler avec des archives TAR. Nous avons vu les différents modes de fonctionnement, ce que le Tarfil
et Tarinfo
Les classes représentent, et certaines des méthodes les plus utilisées pour énumérer le contenu d'une archive, pour ajouter de nouveaux fichiers ou pour les extraire. Pour une connaissance plus approfondie du tarfil
Module Veuillez jeter un œil à la documentation officielle du module
Tutoriels Linux connexes:
- Une introduction à l'automatisation Linux, des outils et des techniques
- Choses à installer sur Ubuntu 20.04
- Masterring Bash Script Loops
- Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
- Boucles imbriquées dans les scripts bash
- Ubuntu 22.04 Sauvegarde et restauration du système
- Mint 20: Mieux que Ubuntu et Microsoft Windows?
- Comment créer des sauvegardes incrémentielles et différentielles avec du goudron
- Comment créer et extraire des archives CPIO sur des exemples Linux
- Introduction à la sauvegarde Borg