The tarfile module provides read and write access to Unix tar archives, including compressed files. In addition to the POSIX standards, several GNU tar extensions are supported. Unix special file types such as hard and soft links, and device nodes are also handled.

Testing Tar Files


In [4]:
import tarfile

for filename in ['zlib_server.py', 'example.tar',
                 'tarfile.ipynb', 'notthere.tar']:
    try:
        print('{:>15}  {}'.format(filename, tarfile.is_tarfile(
            filename)))
    except IOError as err:
        print('{:>15}  {}'.format(filename, err))


 zlib_server.py  False
    example.tar  True
  tarfile.ipynb  False
   notthere.tar  [Errno 2] No such file or directory: 'notthere.tar'

Reading Metadata from An archive


In [5]:
import tarfile
with tarfile.open('example.tar', 'r') as t:
    print(t.getnames())


['./example.txt.gz', './gzip.ipynb', './tarfile.ipynb', './zlib.ipynb', './zlib_server.py']

In [6]:
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()


./example.txt.gz
  Modified: Wed Sep  6 20:48:27 2017
  Mode    : 0o644
  Type    : b'0'
  Size    : 2942 bytes

./gzip.ipynb
  Modified: Wed Sep  6 20:40:56 2017
  Mode    : 0o644
  Type    : b'0'
  Size    : 2360 bytes

./tarfile.ipynb
  Modified: Wed Sep  6 20:46:59 2017
  Mode    : 0o644
  Type    : b'0'
  Size    : 1950 bytes

./zlib.ipynb
  Modified: Wed Sep  6 20:34:27 2017
  Mode    : 0o644
  Type    : b'0'
  Size    : 3568 bytes

./zlib_server.py
  Modified: Wed Sep  6 20:34:19 2017
  Mode    : 0o644
  Type    : b'0'
  Size    : 2948 bytes


In [8]:
import tarfile
import time

with tarfile.open('example.tar', 'r') as t:
    for filename in ['zlib_server.py', '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))


ERROR: Did not find zlib_server.py in tar archive
ERROR: Did not find notthere.txt in tar archive

Creating New Archive


In [9]:
import tarfile
print('creating archive')
with tarfile.open('tarfile_add.tar', mode='w') as out:
    print('add zlib_server.py')
    out.add('zlib_server.py')
print()
print('Contents:')
with tarfile.open('tarfile_add.tar', mode='r') as t:
    for member_info in t.getmembers():
        print(member_info.name)


creating archive
add zlib_server.py

Contents:
zlib_server.py

Appending to Archives


In [12]:
import tarfile

print('creating archive')
with tarfile.open('tarfile_append.tar', mode='w') as out:
    out.add('gzip.ipynb')

print('contents:',)
with tarfile.open('tarfile_append.tar', mode='r') as t:
    print([m.name for m in t.getmembers()])

print('adding index.rst')
with tarfile.open('tarfile_append.tar', mode='a') as out:
    out.add('zlib.ipynb')

print('contents:',)
with tarfile.open('tarfile_append.tar', mode='r') as t:
    print([m.name for m in t.getmembers()])


creating archive
contents:
['gzip.ipynb']
adding index.rst
contents:
['gzip.ipynb', 'zlib.ipynb']