Prehľad modulov pre Python 1 – tarfile

Vítam Vás pri čítaní môjho článku o module tarfile. Rozhodol som sa, že budem písať o rôznych moduloch, ktoré sa mi hodili pri písaní Python skriptov. Dúfam že pár ľudí presvedčím o tom aký Python býva praktický a ako občas elegantne rieši problémy. Modul tarfile archivuje a komprimuje súbory vo formáte tar.

Veľa súborov

Tu sú možné problémy, ktoré modul rieši:

Ak treba automaticky rôzne archivovať súbory, alebo posielať emailom alebo uploadovať viac súborov, môže byť užitočný šikovný skript.

Počítačové hry môžu mať 100-ky súborov so zvukmi, textúrami, modelmi atď. Prakticky hociaký program s veľa súbormi sa pomaly inštaluje, maže a spomaľuje kontrolu antivírom. Tomuto problému sa dá predísť presunutím súborov do archívov.

Potreboval som pristupovať iba na čítanie k cca 10000 súborom, každý bol roztriedený do 26 adresárov podľa začiatočného písmena A..Z. Modulom tarfile som ich dostal do 26 zvlášť archívov. Kompresiu som nepoužil, lebo bola neefektívna a spomaľovala prístup k súborom aj o niekoľko sekúnd.

 

Modul tarfile

Tento modul je štandardne dodávaný s Pythonom, takže nič zvlášť netreba inštalovať. Jeho úlohou je umožniť vytvárať archívy formátu tar, či už bez kompresie alebo s pridanou kompresiou algoritmom gzip alebo bzip2 a plniť ich súbormi, alebo ich extrahovať či už na disk alebo do pamäti. S archívom sa pracuje obdobne ako so súborovým objektom otvoreným builtin funkciou open. Na začiatku sa archív otvára pre čítanie, rozširovanie alebo zápis funkciou pomocou funkcie tarfile.open, ktorá vráti TarFile objekt. Potom sa s archívom cez objekt dá manipulovať a nakoniec sa súbor zavrie jeho metódou close.

 

Vytváranie archívu

Ak sa funkcia tarfile.open volá s parametrom w, vytvorí nový archív alebo prepíše pôvodný so zadaným názvom. Metóda add pridáva súbory alebo celé adresáre do archívu.

Príklad:

import tarfile
x = tarfile.open(“mojarchiv.tar”, “w”)
x.add(“aaa.txt”)
x.add(“bbb.txt”)
x.close()

Ak treba pridať súbory do existujúceho archívu použije sa pri otváraní parameter a

import tarfile
x = tarfile.open(“mojarchiv.tar”, “a”)
x.add(“ccc.txt”)
x.close()

 

Extrahovanie z archívu

Archív sa otvorí na čítanie parametrom r. Konkrétny súbor sa extrahuje dvoma možnými metódami. Metóda extract ukladá súbor na disk a metóda extractfile vráti file objekt, pomocou ktorého môžete čítať súbor priamo z archívu bez toho aby sa niekam dočasne ukladal na disk.

Príklad s konkrétnym súborom:

import tarfile
x = tarfile.open(“mojarchiv.tar”, “r”)
x.extract(“bbb.txt”) # na HDD
# vypise na obrazovku subor bez ukladania
fbbb = x.extractfile(“bbb.txt”)
print fbbb.read()
fbbb.close()  # zatvori citany subor v archive
x.close()  # zatvori archiv

Adresár, do ktorého sa súbor extrahuje sa dá určit metóde extract parametrom path:

import os
# ulozi extrahovane bbb.txt do podadresara abc v aktualnom adreari
x.extract(“bbb.txt”, path=os.path.join(os.getcwd(), “abc”) )
x.close()

 

Kompresia

Čistý tar archív iba balí súbory, nekomprimuje ich.

Kompresný algoritmus sa dá pri zapisovaní alebo čítaní archívu určiť parametrami :gz alebo :bz2 hneď za písmeno určujúce mód prístupu r, w alebo a v druhom parametri open.

Pri čítaní kompresiu udávať netreba, tarfile kompresiu automaticky detekuje.

Príklad otvorenia archívu na zápis s bz2 kompresiou:

x = tarfile.open(“mojarchiv.tar.bz2”, “w:bz2”)

 

Ďaľšie informácie

…sa nachádzajú v oficiálnej dokumentácii pre modul (viz. zdroje)

Nech Vám skripty slúžia.

 

Zdroje

http://docs.python.org/library/tarfile.html

http://www.java2s.com/Code/Python/File/Readingtheentirefileatonce.htm

http://en.wikipedia.org/wiki/Tar_(file_format)

2 thoughts on “Prehľad modulov pre Python 1 – tarfile

  1. Kam sa ulozi extrahovany subor? co ak uz taky existuje? hodi to exception? (x.extract(“bbb.txt”) # na HDD) .. co takto komprimovat jednotlive subory vnutri? to by uz nemuselo zrat vykon

    • extrahovany subor sa uklada do aktualneho adresara, ten sa da urcit pomocou funkcie os.chdir(cesta) z modulu os
      pri pokuse extrahovat subor ktory nieje v archive: vyvola exception KeyError
      pri extrahovani suboru s menom ktore uz existuje: povodny subor je bez varovania premazany
      ochrana pred premazanim sa da dodat pomocou kontroly existencie suboru os.path.exists(cesta) z modulu os
      to komprimovanie kazdeho suboru zvlast ma napadlo, kedze som ukladal subory vo wav formate, zvuky som prekodoval do ogg a usetril som tak 80% miesta, ulozene boli v tar bez kompresie a pristup bol okamzity

Zanechajte komentár