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