Comment créer et manipuler les archives TAR à l'aide de Python

Comment créer et manipuler les archives TAR à l'aide de Python

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

Exigences logicielles et conventions de ligne de commande Linux
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 toutMé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