Cómo crear y manipular archivos de alquitrán usando Python
- 2847
- 352
- Eduardo Tapia
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
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 dominiops - 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 todo
Mé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