tarfile — Acceso a archivos Tar
Propósito: Acceso a archivos Tar
El módulo tarfile proporciona acceso de lectura y escritura a archivos de Unix
tar, incluyendo archivos comprimidos. Además de los estándares POSIX, varias
extensiones de tar de GNU son compatibles. Tipos especiales de archivos Unix,
como los enlaces duros y blandos, y los nodos de dispositivos también son
manejados.
Nota
Aunque tarfile implementa un formato Unix, puede usarse también para crear y
leer archivos tar en Microsoft Windows.
Archivos Tar de prueba
La función is_tarfile() devuelve un valor booleano que indica si o no, el nombre
de archivo pasado como argumento hace referencia a un archivo tar válido.
tarfile_is_tarfile.py
import tarfile
for filename in ['[Link]', '[Link]',
'bad_example.tar', '[Link]']:
try:
print('{:>15} {}'.format(filename, tarfile.is_tarfile(
filename)))
except IOError as err:
print('{:>15} {}'.format(filename, err))
Si el archivo no existe, is_tarfile() levanta el IOError .
$ python3 tarfile_is_tarfile.py
[Link] False
[Link] True
bad_example.tar False
[Link] [Errno 2] No such file or directory:
'[Link]'
Leer de metadatos de un archivo
Usa la clase TarFile para trabajar directamente con un archivo tar. Ésta admite
métodos para leer datos sobre archivos existentes, así como modificar los
archivos agregando archivos adicionales.
Para leer los nombres de los archivos en un archivo existente, usa getnames() .
tarfile_getnames.py
import tarfile
with [Link]('[Link]', 'r') as t:
print([Link]())
El valor de retorno es una lista de cadenas con los nombres del contenido del
archivo.
$ python3 tarfile_getnames.py
['[Link]', '[Link]']
Además de los nombres, los metadatos sobre los miembros del archivo están
disponibles como instancias de objetos TarInfo .
tarfile_getmembers.py
import tarfile
import time
with [Link]('[Link]', 'r') as t:
for member_info in [Link]():
print(member_info.name)
print(' Modified:', [Link](member_info.mtime))
print(' Mode :', oct(member_info.mode))
print(' Type :', member_info.type)
print(' Size :', member_info.size, 'bytes')
print()
Cargue los metadatos a través de getmembers() y getmember() .
$ python3 tarfile_getmembers.py
[Link]
Modified: Fri Aug 19 16:27:54 2016
Mode : 0o644
Type : b'0'
Size : 9878 bytes
[Link]
Modified: Fri Aug 19 16:27:54 2016
Mode : 0o644
Type : b'0'
Size : 75 bytes
Si el nombre del miembro del archivo es conocido de antemano, su
objeto TarInfo se puede recuperar con getmember() .
tarfile_getmember.py
import tarfile
import time
with [Link]('[Link]', 'r') as t:
for filename in ['[Link]', '[Link]']:
try:
info = [Link](filename)
except KeyError:
print('ERROR: Did not find {} in tar archive'.format(
filename))
else:
print('{} is {:d} bytes'.format(
[Link], [Link]))
Si el miembro del archivo no está presente, getmember() levanta un KeyError .
$ python3 tarfile_getmember.py
[Link] is 75 bytes
ERROR: Did not find [Link] in tar archive
Extraer archivos de un archivo
Para acceder a los datos de un miembro del archivo dentro de un programa, usa
el método extractfile() , pasando el nombre del miembro.
tarfile_extractfile.py
import tarfile
with [Link]('[Link]', 'r') as t:
for filename in ['[Link]', '[Link]']:
try:
f = [Link](filename)
except KeyError:
print('ERROR: Did not find {} in tar archive'.format(
filename))
else:
print(filename, ':')
print([Link]().decode('utf-8'))
El valor de retorno es un objeto similar a un archivo desde el cual se pueden leer
los contenidos del miembro del archivo.
$ python3 tarfile_extractfile.py
[Link] :
The examples for the tarfile module use this file and
[Link] as data.
ERROR: Did not find [Link] in tar archive
Para descomprimir el archivo y escribir los archivos en el sistema de archivos,
usa extract() o extractall() en su lugar.
tarfile_extract.py
import tarfile
import os
[Link]('outdir')
with [Link]('[Link]', 'r') as t:
[Link]('[Link]', 'outdir')
print([Link]('outdir'))
El miembro o miembros se leen del archivo y se escriben en el sistema de
archivos, comenzando en el directorio nombrado en los argumentos.
$ python3 tarfile_extract.py
['[Link]']
La documentación de la biblioteca estándar incluye una nota que indica
que extractall() es más segura que extract() , especialmente para trabajar con
la transmisión de datos donde rebobinar para leer una parte anterior de la
entrada no es posible, y debe utilizarse en la mayoría de los casos.