Ebben a cikkben arról lesz szó, hogyan hozhatunk létre zip-archívumot szűrők alapján kiválasztott fájlokból vagy egy könyvtárból származó fájlokból.
A python zipfile modulja egy ZipFile osztályt biztosít a zip-fájlokkal kapcsolatos dolgokhoz. Használjuk ezt egy zip archív fájl létrehozásához.
Először importáljuk az osztályt a modulból, azaz
from zipfile import ZipFile
Create a zip archive from multiple files in Python
Steps are,
- Create a ZipFile object by passing the new file name and mode as ‘w’ (write mode). Létrehoz egy új zip fájlt és megnyitja a ZipFile objektumon belül.
- Hívja a write() függvényt a ZipFile objektumon a fájlok hozzáadásához.
- Hívja a close() függvényt a ZipFile objektumon a zip fájl bezárásához.
Ez létrehoz egy ‘sample.zip’ zip fájlt a megadott fájlokkal benne.
Meg tudjuk csinálni ugyanezt a “with open” . Automatikusan bezárja a zip-fájlt, amikor a ZipFile objektum kikerül a hatóköréből, azaz.
Create a zip archive of a directory
Egy könyvtár összes tartalmának zip-archívumba való zipeléséhez a könyvtárban és annak alkönyvtáraiban lévő összes fájlon végig kell mennünk, majd a ZipFile segítségével minden egyes bejegyzést hozzá kell adnunk a zip-fájlhoz.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))
Ez egy könyvtár összes tartalmát egyetlen zip-fájlba, azaz a ‘sampleDir.zip’-be fogja zipelni. Tartalma a következő lesz,
Kiválasztott fájlok zipelése egy könyvtárból szűrő vagy vadkártyák alapján
A könyvtárból kiválasztott fájlok zipeléséhez az iteráció során ellenőriznünk kell az egyes fájlok útvonalának feltételét, mielőtt hozzáadnánk őket a zip fájlhoz.
Készítsünk olyan függvényt, amely egy könyvtáron iterál és a tartalmat adott visszahívással kiszűri. Csak azok a fájlok kerülnek bele a zip-be, amelyek átmennek a szűrőn.
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))
Csomagoljuk csak a csv fájlokat egy könyvtárból, azaz adjunk át egy lambda függvényt argumentumként.
zipFilesInDir('sampleDir', 'sampleDir2.zip', lambda name : 'csv' in name)
Ez létrehoz egy ‘sampleDir2.zip’ zip archívumot a megadott könyvtár összes csv fájljával.
A teljes példa az alábbi: