Pythonin standardikirjaston zipfile-moduulia voidaan käyttää tiedostojen pakkaamiseen ZIP-tiedostoiksi ja ZIP-tiedostojen purkamiseen. Se sisältyy standardikirjastoon, joten lisäasennusta ei tarvita.
Seuraava sisältö selitetään.
- Pakkaa useita tiedostoja ZIP-tiedostoksi
- Uuden tiedoston lisääminen olemassa olevaan ZIP-tiedostoon
- Hakemiston (kansion) pakkaaminen ZIP-tiedostoksi
- Pakattu ZIP-tiedostoon, jossa on salasana.
- Tarkista ZIP-tiedoston sisältö.
- Pura (purkaa) ZIP-tiedoston koko sisältö.
- Valitse ZIP-tiedoston sisältö ja pura se.
- Pakkaa useita tiedostoja ZIP-tiedostoksi
- Uuden tiedoston lisääminen olemassa olevaan ZIP-tiedostoon
- Hakemiston (kansion) pakkaaminen ZIP-tiedostoksi
- Pakattu ZIP-tiedostoon, jossa on salasana.
- Tarkista ZIP-tiedoston sisältö.
- Pura (purkaa) ZIP-tiedoston koko sisältö.
- Valitse ZIP-tiedoston sisältö ja pura se.
Pakkaa useita tiedostoja ZIP-tiedostoksi
Luo ZipFile-olio ja käytä write()-metodia lisätäksesi tiedostot, jotka haluat pakata.
Jos haluat luoda uuden ZIP-tiedoston, määritä luotavan ZIP-tiedoston polku ZipFile-olion konstruktorin ensimmäiseksi argumentiksi ja toinen argumentti seuraavasti'w'
Lisäksi pakkaustapa voidaan määrittää kolmantena argumenttina.
zipfile.ZIP_STORED
:Yhdistää vain useita tiedostoja ilman pakkausta (oletus)zipfile.ZIP_DEFLATED
:Normaali ZIP-pakkaus (zlib-moduuli vaaditaan)zipfile.ZIP_BZIP2
:BZIP2-pakkaus (bz2-moduuli vaaditaan)zipfile.ZIP_LZMA
:LZMA-pakkaus (lzma-moduuli vaaditaan)
BZIP2:lla ja LZMA:lla on korkeampi pakkaussuhde (voidaan pakata pienempään kokoon), mutta pakkaamiseen kuluva aika on pidempi.
Kirjoita()-metodissa tiedosto, jonka ensimmäinen argumentti on filename, kirjoitetaan ZIP-tiedostoon, jonka toinen argumentti on arcname. Jos arcname jätetään pois, tiedostonimeä käytetään sellaisenaan. arcname voi myös määrittää hakemistorakenteen.
ZipFile-olio on suljettava close()-metodilla, mutta jos käytät with-lausetta, se suljetaan automaattisesti, kun lohko on päättynyt.
import zipfile
with zipfile.ZipFile('data/temp/new_comp.zip', 'w', compression=zipfile.ZIP_DEFLATED) as new_zip:
new_zip.write('data/temp/test1.txt', arcname='test1.txt')
new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')
Määrittämällä write()-menetelmän compress_type-argumentin on myös mahdollista valita kunkin tiedoston pakkausmenetelmä.
with zipfile.ZipFile('data/temp/new_comp_single.zip', 'w') as new_zip:
new_zip.write('data/temp/test1.txt', arcname='test1.txt', compress_type=zipfile.ZIP_DEFLATED)
new_zip.write('data/temp/test2.txt', arcname='zipdir/test2.txt')
new_zip.write('data/temp/test3.txt', arcname='zipdir/sub_dir/test3.txt')
Uuden tiedoston lisääminen olemassa olevaan ZIP-tiedostoon
Jos haluat lisätä uuden tiedoston olemassa olevaan zip-tiedostoon, aseta konstruktorin ensimmäiseksi argumentiksi ZipFile-olion luomisen yhteydessä olemassa olevan zip-tiedoston polku. Aseta myös toisen argumentin tila seuraavasti.'a'
Tämän jälkeen, kuten yllä olevassa esimerkissä, lisää tiedosto käyttämällä write()-metodia.
with zipfile.ZipFile('data/temp/new_comp.zip', 'a') as existing_zip:
existing_zip.write('data/temp/test4.txt', arcname='test4.txt')
Hakemiston (kansion) pakkaaminen ZIP-tiedostoksi
Jos haluat pakata kokonaisen hakemiston (kansion) yhdeksi ZIP-tiedostoksi, voit käyttää os.scandir()- tai os.listdir()-toimintoa tiedostoluettelon tekemiseen, mutta on helpompaa käyttää shutil-moduulin make_archive()-toimintoa.
Katso seuraava artikkeli.
- Aiheeseen liittyvät artikkelit:Hakemiston (kansion) pakkaaminen zipiksi tai tariksi Pythonissa
Pakattu ZIP-tiedostoon, jossa on salasana.
zipfile-moduulin avulla et voi luoda salasanalla suojattuja ZIP-tiedostoja. Jos haluat pakata tiedoston salasanalla suojattuun zip-tiedostoon, käytä kolmannen osapuolen kirjastoa pyminizip.
Huomaa, että salasanasuojattujen ZIP-tiedostojen purku voidaan tehdä zipfile-moduulilla (katso alla).
Tarkista ZIP-tiedoston sisältö.
Voit tarkistaa olemassa olevan ZIP-tiedoston sisällön.
Luo ZipFile-olio asettamalla konstruktorin ensimmäiseksi argumentiksi file olemassa olevan zip-tiedoston polku ja toiseksi argumentiksi mode 'r'. Mode-argumentti voidaan jättää pois, koska oletusarvo on 'r'.
Voit käyttää ZipFile-olion namelist()-metodia saadaksesi luettelon arkistoitavista tiedostoista.
with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
print(existing_zip.namelist())
# ['test1.txt', 'zipdir/test2.txt', 'zipdir/sub_dir/test3.txt', 'test4.txt']
Pura (purkaa) ZIP-tiedoston koko sisältö.
Jos haluat purkaa ZIP-tiedoston sisällön, luo ZipFile-olio, jonka konstruktorin ensimmäinen argumentti file on olemassa olevan ZIP-tiedoston polku ja toinen argumentti mode on 'r', kuten yllä olevassa esimerkissä. Mode-argumentti voidaan jättää pois, koska sen oletusarvo on 'r'.
ZipFile-olion extractall()-metodi purkaa (purkaa pakkauksen) ZIP-tiedoston koko sisällön. Ensimmäinen argumentti, path, määrittää hakemiston polun, johon tiedosto puretaan. Jos se jätetään pois, tiedostot puretaan nykyiseen hakemistoon.
with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
existing_zip.extractall('data/temp/ext')
Salasanan sisältävä ZIP-tiedosto voidaan purkaa määrittämällä salasana extractall()-menetelmän argumentiksi pwd.
with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
pass_zip.extractall('data/temp/ext_pass', pwd='password')
Valitse ZIP-tiedoston sisältö ja pura se.
Jos haluat purkaa ja purkaa vain tietyt tiedostot, käytä menetelmää extract().
Extract()-menetelmän ensimmäinen argumentti on purettavan tiedoston nimi ja toinen argumentti path on hakemiston polku, johon puretaan. Jos path-argumentti jätetään pois, tiedosto puretaan nykyiseen hakemistoon. Purettavan tiedoston nimen on sisällettävä ZIP-tiedoston hakemiston polku, jos se on tallennettu sinne.
with zipfile.ZipFile('data/temp/new_comp.zip') as existing_zip:
existing_zip.extract('test1.txt', 'data/temp/ext2')
Kuten extractall()-menetelmässä, myös extract()-menetelmässä voit määrittää salasanan argumentiksi pwd.
with zipfile.ZipFile('data/temp/new_comp_with_pass.zip') as pass_zip:
pass_zip.extract('test1.txt', 'data/temp/ext_pass2', pwd='password')