V tomto článku se budeme zabývat tím, jak vytvořit archiv zip z vybraných souborů nebo souborů z adresáře na základě filtrů.
Modul zipfile v Pythonu poskytuje třídu ZipFile pro věci související se soubory zip. Použijme ji k vytvoření archivního souboru zip.
Nejprve importujte třídu z modulu, tj.
from zipfile import ZipFile
Vytvoření archivu zip z více souborů v jazyce Python
Kroky jsou následující,
- Vytvořte objekt ZipFile předáním názvu nového souboru a režimu jako ‚w‘ (režim zápisu). Vytvoří nový soubor ZIP a otevře jej v objektu ZipFile.
- Voláním funkce write() na objektu ZipFile do něj přidáme soubory.
- voláním funkce close() na objektu ZipFile zavřeme soubor ZIP.
Vytvoří soubor ZIP ‚sample.zip‘ s danými soubory uvnitř.
Též můžeme provést pomocí funkce „with open“ . Soubor zip se automaticky uzavře, když objekt ZipFile opustí obor, tj.
Vytvoření archivu zip adresáře
Chceme-li zazipovat celý obsah adresáře do archivu zip, musíme iterovat všechny soubory v adresáři a jeho podadresářích a pak přidat každou položku do souboru zip pomocí ZipFile.write()
from zipfile import ZipFileimport osfrom os.path import basename# create a ZipFile objectwith ZipFile('sampleDir.zip', 'w') as zipObj: # Iterate over all the files in directory for folderName, subfolders, filenames in os.walk(dirName): for filename in filenames: #create complete filepath of file in directory filePath = os.path.join(folderName, filename) # Add file to zip zipObj.write(filePath, basename(filePath))
To zazipuje celý obsah adresáře do jednoho souboru zip, tj. ‚sampleDir.zip‘. Jeho obsah bude,
Zipovat vybrané soubory z adresáře na základě filtru nebo zástupných znaků
Pro zazipování vybraných souborů z adresáře musíme při iteraci kontrolovat podmínku na každé cestě k souboru před jeho přidáním do souboru zip.
Vytvoříme funkci, která bude iterovat nad adresářem a filtrovat obsah pomocí daného zpětného volání. Soubory, které projdou filtrem, budou přidány pouze do zipu, tj.
from zipfile import ZipFileimport osfrom os.path import basename# Zip the files from given directory that matches the filterdef zipFilesInDir(dirName, zipFileName, filter): # create a ZipFile object with ZipFile(zipFileName, 'w') as zipObj: # Iterate over all the files in directory for folderName, subfolders, filenames in os.walk(dirName): for filename in filenames: if filter(filename): # create complete filepath of file in directory filePath = os.path.join(folderName, filename) # Add file to zip zipObj.write(filePath, basename(filePath))
Zipujme pouze csv soubory z adresáře, tj. předejme jí jako argument lambda funkci.
zipFilesInDir('sampleDir', 'sampleDir2.zip', lambda name : 'csv' in name)
Vytvoří zip archiv ‚sampleDir2.zip‘ se všemi csv soubory z daného adresáře.
Kompletní příklad je následující: