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()