Een directory (map) comprimeren in een zip of tar in Python

Bedrijf

Wanneer je een volledige directory (map) comprimeert in een zip-bestand in Python, kan je os.scandir() of os.listdir() gebruiken om een lijst van bestanden te maken en de zipfile module gebruiken om ze te comprimeren, maar het is eenvoudiger om de make_archive () van de shutil module te gebruiken.

Naast zip worden ook andere formaten zoals tar ondersteund.

Voor meer informatie over het comprimeren en decomprimeren van zip-bestanden met behulp van de zipfile module, zie het volgende artikel.

Een directory (map) comprimeren tot een zip-bestand:shutil.make_archive()

Het eerste argument, base_name, specificeert de naam van het aan te maken zip-bestand (zonder extensie), en het tweede argument, format, specificeert het formaat van het archief.

Voor het argumentformaat kan het volgende worden gekozen.

  • 'zip'
  • 'tar'
  • 'gztar'
  • 'bztar'
  • 'xztar'

Het derde argument, root_dir, specificeert het pad van de hoofddirectory van de te comprimeren directory, en het vierde argument, base_dir, specificeert het pad van de te comprimeren directory ten opzichte van de root_dir. Beide zijn standaard ingesteld op de huidige directory.

Als base_dir wordt weggelaten, wordt de hele root_dir gecomprimeerd.

data/temp
Bijvoorbeeld, stel we hebben een directory met de volgende structuur.

dir
├── dir_sub
   └── test_sub.txt
└── test.txt
import shutil

shutil.make_archive('data/temp/new_shutil', 'zip', root_dir='data/temp/dir')

De new_shutil.zip gecomprimeerd met de bovenstaande instellingen met weglating van de base_dir zal als volgt worden gedecomprimeerd.

new_shutil
├── dir_sub
   └── test_sub.txt
└── test.txt

Als dan de directory in root_dir wordt opgegeven voor base_dir, zal het volgende worden getoond.

shutil.make_archive('data/temp/new_shutil_sub', 'zip', root_dir='data/temp/dir', base_dir='dir_sub')

De met bovenstaande instellingen gecomprimeerde new_shutil_sub.zip wordt als volgt gedecomprimeerd.

dir_sub
└── test_sub.txt