W tym artykule omówimy, jak utworzyć archiwum zip z wybranych plików lub plików z katalogu na podstawie filtrów.
Moduł zipfile Pythona zapewnia klasę ZipFile do rzeczy związanych z plikami zip. Użyjmy tego do utworzenia pliku archiwum zip.
Najpierw zaimportujmy klasę z modułu i.e.
from zipfile import ZipFile
Utwórz archiwum zip z wielu plików w Pythonie
Kroki są następujące,
- Utwórz obiekt ZipFile, przekazując nazwę nowego pliku i tryb jako 'w’ (tryb zapisu). To utworzy nowy plik zip i otworzy go w obiekcie ZipFile.
- Wywołaj funkcję write() na obiekcie ZipFile, aby dodać do niego pliki.
- Wywołaj funkcję close() na obiekcie ZipFile, aby zamknąć plik zip.
To utworzy plik zip 'sample.zip’ z podanymi plikami wewnątrz niego.
Możemy zrobić to samo z „with open” . To automatycznie zamknie plik zip, gdy obiekt ZipFile wyjdzie poza zakres, tj.
Tworzenie archiwum zip katalogu
Aby zarchiwizować całą zawartość katalogu w archiwum zip, musimy wykonać iterację po wszystkich plikach w katalogu i jego podkatalogach, a następnie dodać każdy wpis do pliku zip za 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))
Zapakuje całą zawartość katalogu do pojedynczego pliku zip, tj. 'sampleDir.zip’. Jego zawartość będzie następująca:
Zapakuj wybrane pliki z katalogu na podstawie filtru lub symboli wieloznacznych
Aby zapakować wybrane pliki z katalogu, musimy sprawdzić warunek na każdej ścieżce pliku podczas iteracji przed dodaniem go do pliku zip.
Utwórzmy funkcję, która iteruje po katalogu i filtruje zawartość z podanym wywołaniem zwrotnym. Pliki, które przejdą przez filtr zostaną dodane do zip’a.
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))
Zapipujmy tylko pliki csv z katalogu, tj. przekażmy funkcję lambda jako argument.
zipFilesInDir('sampleDir', 'sampleDir2.zip', lambda name : 'csv' in name)
Tworzy ona archiwum zip 'sampleDir2.zip’ z wszystkimi plikami csv z danego katalogu.
Kompletny przykład jest następujący: