Está en la página 1de 4

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 ['README.txt', 'example.tar',


'bad_example.tar', 'notthere.tar']:
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

README.txt False
example.tar True
bad_example.tar False
notthere.tar [Errno 2] No such file or directory:
'notthere.tar'

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 tarfile.open('example.tar', 'r') as t:


print(t.getnames())

El valor de retorno es una lista de cadenas con los nombres del contenido del
archivo.

$ python3 tarfile_getnames.py

['index.rst', 'README.txt']
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 tarfile.open('example.tar', 'r') as t:


for member_info in t.getmembers():
print(member_info.name)
print(' Modified:', time.ctime(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

index.rst
Modified: Fri Aug 19 16:27:54 2016
Mode : 0o644
Type : b'0'
Size : 9878 bytes

README.txt
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 tarfile.open('example.tar', 'r') as t:


for filename in ['README.txt', 'notthere.txt']:
try:
info = t.getmember(filename)
except KeyError:
print('ERROR: Did not find {} in tar archive'.format(
filename))
else:
print('{} is {:d} bytes'.format(
info.name, info.size))
Si el miembro del archivo no está presente,  getmember()  levanta un  KeyError .

$ python3 tarfile_getmember.py

README.txt is 75 bytes
ERROR: Did not find notthere.txt 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 tarfile.open('example.tar', 'r') as t:


for filename in ['README.txt', 'notthere.txt']:
try:
f = t.extractfile(filename)
except KeyError:
print('ERROR: Did not find {} in tar archive'.format(
filename))
else:
print(filename, ':')
print(f.read().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

README.txt :
The examples for the tarfile module use this file and
example.tar as data.

ERROR: Did not find notthere.txt 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

os.mkdir('outdir')
with tarfile.open('example.tar', 'r') as t:
t.extract('README.txt', 'outdir')
print(os.listdir('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
['README.txt']

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.

También podría gustarte