Cómo crear y manipular archivos de alquitrán usando Python

Cómo crear y manipular archivos de alquitrán usando Python

En Linux y otros sistemas operativos similares a UNIX, Tar es sin duda una de las utilidades de archivo más utilizadas; Nos permite crear archivos, a menudo llamados "tarballs", podemos usar para la distribución del código fuente o fines de respaldo. En este tutorial veremos cómo leer, crear y modificar los archivos de alquitrán con Python, utilizando el tarfi módulo.

En este tutorial aprenderás:

  • Los modos en los que se puede abrir un archivo de alquitrán utilizando el módulo de tarfile
  • ¿Cuáles son las clases Tarinfo y Tarfile y qué representan?
  • Cómo enumerar el contenido de un archivo de alquitrán
  • Cómo extraer el contenido de un archivo de alquitrán
  • Cómo agregar archivos a un archivo de alquitrán


Requisitos y convenciones de software utilizados

Requisitos de software y convenciones de línea de comandos de Linux
Categoría Requisitos, convenciones o versión de software utilizada
Sistema Independiente de la distribución
Software Python3
Otro Conocimientos básicos de Python3 y programación orientada a objetos
Convenciones # - requiere que los comandos de Linux dados se ejecuten con privilegios raíz directamente como un usuario raíz o mediante el uso de sudo dominio
ps - Requiere que los comandos de Linux dados se ejecuten como un usuario regular no privilegiado

Uso básico

El tarfi El módulo está incluido en la biblioteca estándar de Python, por lo que no necesitamos instalarlo por separado; Para usarlo, solo necesitamos "importarlo". La forma recomendada de acceder a un tarball usando este módulo es por el abierto función; En su uso más básico, debemos proporcionar, como el primer y segundo argumento:

  • El nombre del tarball al que queremos acceder
  • El modo en el que debe abrirse

El "modo" utilizado para abrir un archivo de alquitrán depende de la acción que queremos realizar y del tipo de compresión (si lo hay) en uso. Vamos a verlos juntos.

Abrir un archivo en modo de solo lectura

Si queremos examinar o extraer el contenido de un archivo de alquitrán, podemos usar uno de los siguientes modos, para abrirlo de solo lectura:

Modo Significado
'r' Modo de solo leer: el tipo de compresión se manejará automáticamente
'R:' Modo de solo lectura sin compresión
'R: GZ' Modo de solo lectura - cremallera compresión explícitamente especificada
'R: BZ2' Modo de solo lectura - bzip compresión explícitamente especificada
'r: xz' Modo de solo lectura - lzma compresión explícitamente especificada

En la mayoría de los casos, donde el método de compresión se puede detectar fácilmente, el modo recomendado para usar es 'r'.

Abrir un archivo para agregar archivos

Si queremos agregar archivos a un archivo existente, podemos usar el 'a' modo. Es importante notar que es posible agregar a un archivo solo si no está comprimido; Si intentamos abrir un archivo comprimido con este modo, un ValueError Se planteará la excepción. Si hacemos referencia a un archivo inexistente, se creará en la mosca.

Abrir un archivo para escribir

Si queremos crear explícitamente un nuevo archivo y abrirlo para escribir, podemos usar uno de los siguientes modos:

Modo Significado
'W' Abra el archivo para escribir - no use compresión
'W: GZ' Abra el archivo para escribir - use gzip compresión
'W: bz' Abra el archivo para escribir - use bzip2 compresión
'W: xz' Abra el archivo para escribir - use lzma compresión

Si se abre un archivo de archivo existente para escribir, se trunca, por lo que todo su contenido se descarta. Para evitar tales situaciones, es posible que deseemos abrir el archivo exclusivamente, Como se describe en la siguiente sección.

Crear un archivo solo si no existe

Cuando queremos asegurarnos de que un archivo existente no se anule al crear un archivo, debemos abrirlo exclusivamente. Si usamos el 'X' modo y un archivo con el mismo nombre del que ya especificamos para el archivo ya existe, un FileExisterRor se criará. Los métodos de compresión se pueden especificar de la siguiente manera:

Modo Significado
'X' Crea el archivo sin compresión si no existe
'X: GZ' Crea el archivo con gzip compresión solo si no existe
'X: BZ2' Crea el archivo con bzip2 compresión solo si no existe
'x: xz' Crea el archivo con lzma compresión solo si no existe

Trabajando con archivos

Hay dos clases proporcionadas por el tarfi módulo que se utilizan para interactuar con los archivos de alquitrán y sus contenidos, y son, respectivamente: Tarfi y Tarro. El primero se usa para representar un archivo de alquitrán en su totalidad y puede usarse como un gerente de contexto con la pitón con Declaración, este último se usa para representar un miembro del archivo y contiene varias información al respecto. Como primer paso, nos centraremos en algunos de los métodos más utilizados de la Tarfi Clase: podemos usarlos para realizar operaciones comunes en archivos de alquitrán.

Recuperar una lista de los miembros del archivo

Para recuperar una lista de los miembros del archivo, podemos usar el GetMembers método de un Tarfi objeto. Este método devuelve una lista de Tarro Objetos, uno para cada miembro del archivo. Aquí hay un ejemplo de su uso con un archivo ficticio comprimido que contiene dos archivos:

>>> con tarfile.archivo abierto.alquitrán.gz ',' r ') como archivo: ... archivo.GetMembers () ... [, ] 
Copiar

Como veremos más adelante, podemos acceder a algunos de los atributos de un archivo archivado, como tiempo de propiedad y modificación, a través del correspondiente Tarro Propiedades y métodos del objeto.

Mostrando el contenido de un archivo de alquitrán

Si todo lo que queremos hacer es mostrar el contenido de un archivo de alquitrán, podemos abrirlo en modo de lectura y usar el lista método del Tarfi clase.

>>> con tarfile.archivo abierto.alquitrán.gz ',' r ') como archivo: ... archivo.lista() ... ?RW-R-R-- EGDOC/EGDOC 0 2020-05-16 15:45:45 Archivo1.TXT ?RW-R-R-- EGDOC/EGDOC 0 2020-05-16 15:45:45 File2.TXT 
Copiar

Como puede ver, la lista de los archivos contenidos en el archivo se muestra como salida. El lista El método acepta un parámetro posicional, verboso cual es Verdadero por defecto. Si cambiamos su valor a FALSO, Solo los nombres de archivo se informarán en la salida, sin información adicional.

El método también acepta un parámetro con nombre opcional, miembros. Si se usa, el argumento proporcionado debe ser un subconjunto de la lista de Tarro objetos devueltos por el GetMembers método. Solo se mostrará información sobre los archivos especificados si se utiliza este parámetro y se proporciona un valor correcto.

Extraer a todos los miembros del archivo de alquitrán

Otra operación muy común que deseamos realizar en un archivo de alquitrán es extraer todo su contenido. Para realizar tal operación podemos usar el extraer todoMétodo del correspondiente Tarfi objeto. Esto es lo que escribiríamos:

>>> con tarfile.archivo abierto.alquitrán.gz ',' r ') como archivo: ... archivo.extraer todo() 
Copiar

El primer parámetro aceptado por el método es camino: Solía ​​especificar dónde se deben extraer los miembros del archivo. El valor predeterminado es '.', Entonces los miembros se extraen en el directorio de trabajo actual.

El segundo parámetro, miembros, se puede utilizar para especificar un subconjunto de miembros para extraer del archivo y, como en el caso del lista método, debe ser un subconjunto de la lista devuelta por el GetMembers método.

El extraer todo El método también tiene un parámetro con nombre, numérico. Es FALSO Por defecto: si lo cambiamos a Verdadero, numérico uid y aturdir se utilizará para establecer la propiedad de los archivos extraídos en lugar de los nombres de los usuarios y grupos.

Extraer solo un miembro del archivo

¿Qué pasa si queremos extraer solo un archivo del archivo?? En ese caso queremos usar el extracto método y haga referencia al archivo que debe ser extraído por su nombre (o como un Tarfi objeto). Por ejemplo, extraer solo el archivo1.TXT Archivo del tarball, correríamos:

>>> con tarfile.archivo abierto.alquitrán.gz ',' r ') como archivo: ... archivo.Extracto ('Archivo1.TXT') 
Copiar

Fácil, ¿no?? El archivo se extrae en el directorio de trabajo actual de forma predeterminada, pero se puede especificar una posición diferente utilizando el segundo parámetro aceptado por el método: camino.

Normalmente los atributos que el archivo tiene dentro del archivo se establece cuando se extrae en el sistema de archivos; Para evitar este comportamiento, podemos establecer el tercer parámetro de la función, set_attrs, a FALSO.

El método acepta también el numérico Parámetro: el uso es el mismo que vimos en el contexto del extraer todo método.

Extraer un miembro de archivo como un objeto similar a un archivo

Vimos cómo, al usar el extraer todo y extracto Métodos Podemos extraer uno o múltiples miembros del archivo de tarro al sistema de archivos. El tarfi El módulo proporciona otro método de extracción: extraer archivo. Cuando se utiliza este método, el archivo especificado no se extrae al sistema de archivos; En su lugar, se devuelve un objeto similar a un archivo de solo lectura:

>>> con tarfile.archivo abierto.alquitrán.gz ',' r ') como archivo: ... fileObj = Archivo.ExtractFile ('archivo1.TXT') ... fileobj.Writable () ... fileobj.leer() ... Falso b'hello \ nworld \ n ' 
Copiar

Agregar archivos a un archivo

Hasta ahora vimos cómo obtener información sobre un archivo y sus miembros, y los diferentes métodos que podemos usar para extraer su contenido; Ahora es el momento de ver cómo podemos agregar nuevos miembros.

La forma más fácil de usar para agregar un archivo a un archivo es utilizando el agregar método. Hacemos referencia al archivo que se incluirá en el archivo por nombre, cuál es el primer parámetro aceptado por el método. El archivo se archivará con su nombre original, a menos que especifiquemos una alternativa utilizando el segundo parámetro posicional: nombre de arco. Supongamos que queremos agregar el archivo1.TXT a un nuevo archivo, pero queremos almacenarlo como archivado_file1.TXT; Escribiríamos:

>>> con tarfile.Abrir ('New_archive.alquitrán.gz ',' w ') como archivo: ... archivo.agregar ('archivo1.txt ',' Archived_file1.TXT') ... archivo.lista() ... -RW-R-R-- EGDOC/EGDOC 12 2020-05-16 17:49:44 Archived_File1.TXT 
Copiar

En el ejemplo anterior, creamos un nuevo archivo sin comprimir usando el 'W' modo y agregó el archivo1.TXT como Archive_File1.TXT, Como puede ver por la salida de lista().

Los directorios se pueden archivar de la misma manera: de forma predeterminada se agregan recursivamente, por lo que junto con su contenido. Este comportamiento se puede cambiar estableciendo el tercer parámetro posicional aceptado por el agregar método, recursivo, a FALSO.

¿Qué pasa si queremos aplicar un filtro, de modo que solo los archivos especificados se incluyan en el archivo?? Para este propósito podemos usar el opcional filtrar parámetro nombrado. El valor pasado a este parámetro debe ser una función que tome un Tarro objeto como argumento y retornos dicho objeto si debe incluirse en el archivo o Ninguno Si debe ser excluido. Veamos un ejemplo. Supongamos que tenemos tres archivos en nuestro directorio de trabajo actual: archivo1.TXT, archivo2.TXT y archivo1.Maryland. Queremos agregar solo los archivos con el .TXT extensión al archivo; Esto es lo que podríamos escribir:

>>> importar os >>> importar tarfil >>> con tarfile.Abrir ('New_archive.alquitrán.gz ',' w ') como archivo: ... para yo en el sistema operativo.listDir (): ... archivo.Agregar (i, filtro = lambda x: x si x.nombre.termina con('.txt ') else ninguno) ... archivo.lista() ... -RW-R-R-- EGDOC/EGDOC 0 2020-05-16 18:26:20 File2.txt -rw-r-r-- EGDOC/EGDOC 0 2020-05-16 18:22:13 Archivo1.TXT 
Copiar

En el ejemplo anterior usamos el sistema operativo.listdir Método para obtener una lista de los archivos contenidos en el directorio de trabajo actual. Iterando sobre dicha lista, usamos el agregar Método para agregar cada archivo al archivo. Pasamos una función como argumento del filtrar parámetro, en este caso uno anónimo, un lambda. La función toma el objeto tarfile como argumento (x) y lo devuelve si su nombre (el nombre es una de las propiedades del Tarro objeto) termina con ".TXT". Si no es el caso, la función regresa Ninguno Entonces el archivo no está archivado.

El objeto Tarinfo

Ya aprendimos que el Tarro Los objetos representan un miembro de Archivo de alquitrán: almacena los atributos del archivo referenciado y proporciona algunos métodos que pueden ayudarnos a identificar el tipo de archivo en sí. El Tarro El objeto no contiene los datos reales del archivo. Algunos de los atributos del Tarro El objeto es:

  • Nombre (nombre del archivo)
  • tamaño (tamaño de archivo)
  • mtime (tiempo de modificación del archivo)
  • uid (la identificación de usuario del propietario del archivo)
  • GID (la ID del grupo de archivos)
  • Uname (el nombre de usuario del propietario del archivo)
  • Gname (el nombre del grupo de archivos)

El objeto también tiene algunos métodos muy útiles, estos son algunos de ellos:

  • isFile (): devuelve verdadero si el archivo es un archivo regular, falso de lo contrario
  • isDir (): devuelve verdadero si el archivo es un directorio, falso de lo contrario
  • issyM () - Devuelve verdadero si el archivo es un enlace simbólico, falso de lo contrario
  • isblk (): devuelve verdadero si el archivo es un dispositivo de bloque, falso de lo contrario

Conclusiones

En este tutorial aprendimos el uso básico del tarfi Módulo de Python, y vimos cómo podemos usarlo para trabajar con los archivos de alquitrán. Vimos los diversos modos de operación, qué Tarfi y Tarro Las clases representan, y algunos de los métodos más utilizados para enumerar el contenido de un archivo, agregar archivos nuevos o extraerlos. Para un conocimiento más profundo del tarfi Módulo, eche un vistazo a la documentación oficial del módulo

Tutoriales de Linux relacionados:

  • Una introducción a la automatización, herramientas y técnicas de Linux
  • Cosas para instalar en Ubuntu 20.04
  • Mastering Bash Script Loops
  • Cosas que hacer después de instalar Ubuntu 20.04 fossa focal Linux
  • Bucles anidados en guiones Bash
  • Ubuntu 22.04 Copia de seguridad y restauración del sistema
  • Mint 20: Mejor que Ubuntu y Microsoft Windows?
  • Cómo crear copias de seguridad incrementales y diferenciales con TAR
  • Cómo crear y extraer archivos de CPIO en ejemplos de Linux
  • Introducción a la copia de seguridad de Borg