Archivace a Balení v Pythonu

Díky zipu tyto dva termíny většinou splývají, protože zip umí oboje. Původní význam těchto termínu je asi takový: Archivace je prosté nakopírování více souborů do jednoho (tar). Balení je komprimace jednoho souboru do jiného (jeden do jednoho) (gzip).

Příklad tar

    import tarfile
    tar = tarfile.open("sample.tar", "w")
    for name in ["foo", "bar", "quux"]:
        tar.add(name)
    tar.close()

Příklad zip

    import zipfile, os

    fzip = zipfile.ZipFile('soubor.zip', 'w')

    slozkaVse=os.listdir(".")   # vse - soubory i slozky
    slozkaSoubory = [soubor for soubor in slozkaVse if os.path.isfile(soubor)]  # jen soubory
    slozkaSoubory.remove("soubor.zip")    # abychom nebalili sami sebe

    for soubor in slozkaSoubory:
        print 'Balim ' + soubor
        fzip.write(soubor)

    fzip.close()

Příklad gzip

    import gzip, os

    seznam=[s for s in os.listdir('.') if os.path.isfile(s)]

    for s in seznam:
        g=gzip.GzipFile(s+'.gz','w')
        x=file(s,'rb').read()  # 'rb' je důležité nejen pro binárky, ale i  pro .doc, .xls, apod...
        g.write(x)
        g.close()

Příklad bzip + tar

    outpath = ''

    import glob
    import tarfile
    import os.path

    ftar = tarfile.open('soubor.tar.bz2', 'w:bz2')
    allfiles = glob.glob(os.path.join(outpath,'*'))
    for i in allfiles:
        print 'Adding ' + i
        ftar.add(i, os.path.basename(i))
    ftar.close()

Vytvoření taru se změnou vlastnostní souboru

Následující kus kódu zabalí podadresář aktuálního adresáře jehož jméno obsahuje proměnná start. Souborům, jejichž jméno končí na configure budou nastavena unixová práva spustitelného souboru, ostatní soubory budou nespustitelné. To se může hodit např. při vytváření archívu určeného pro Linux z Windows.

   from glob import glob
   from os.path import isdir
   from tarfile import *

   start = 'jmeno_adresare'
   tar = TarFile('jmeno_souboru.tar', 'w')

   def work(path):
       files = glob(path + '/*')
       for i in files:
           if isdir(i):
               ti = tar.gettarinfo(i, i[len(start)+1:])
               tar.addfile(ti)
               work(i)
           else:
               ti = tar.gettarinfo(i, i[len(start)+1:])
               if i.endswith('configure'):
                   ti.mode = 0775
               else:
                   ti.mode = 0664
               f = file(i, 'rb')
               tar.addfile(ti, f)
               f.close()

    work(start)
    tar.close()