Работа с zip-архивами в Python, модуль zipfile
23.02.2018
Теги: Python • Web-разработка • Модуль
Модуль zipfile
(входит в стандартный набор python) позволяет работать с zip-архивами. Чтобы записать или прочитать содержимое zip-файла, прежде всего необходимо создать объект ZipFile
. Объекты ZipFile
похожи на объекты File
, возвращаемые функцией open()
.
ZipFile(filename [,mode[,compression[,allowZip64]]])
filename
— имя файла zip архива.mode
'r'
— файл будет открыт для чтения (это режим по умолчанию);'w'
— файл будет открыт для записи; если файл не существует, он будет создан; если файл существует, он будет перезаписан;'a'
— существующий файл будет открыт в режиме добавления файлов в архив.
compression
определяет метод сжатия, который должен использоваться при записи в архив. Он принимает одно из значений:ZIP_STORED
илиZIP_DEFLATED
. По умолчанию используется значениеZIP_STORED
.allowZip64
позволяет разрешить использование расширений ZIP64, которые дают возможность создавать архивы размером больше 2 гигабайт. По умолчанию равенFalse
.
Создание архива, запись файлов и директорий:
>>> import os, zipfile >>> os.chdir('C:\\example') >>> os.listdir() ['images', 'readme.txt'] >>> zipFile = zipfile.ZipFile('archive.zip', 'w', zipfile.ZIP_DEFLATED) >>> zipFile.write('readme.txt') [grn]# добавляем файл в архив[/grn] >>> zipFile.write('images') [grn]# добавляем (пустую) директорию в архив[/grn] >>> zipFile.write('images\\1.jpg') >>> zipFile.write('images\\2.jpg') >>> zipFile.close()
Получение информации о содержимом zip-архива:
>>> zipFile = zipfile.ZipFile('archive.zip', 'r') >>> zipFile.namelist() [grn]# получаем информацию о файлах и директориях[/grn] ['readme.txt', 'images/', 'images/1.jpg', 'images/2.jpg'] >>> zipInfo = zipFile.getinfo('readme.txt') [grn]# получаем информацию об отдельном файле[/grn] >>> zipInfo.file_size 13908 >>> zipInfo.compress_size 3828 >>> zipFile.close()
Извлечение файлов из архива:
>>> zipFile = zipfile.ZipFile('archive.zip', 'r') >>> zipFile.extract('readme.txt') [grn]# извлекаем отдельный файл из корня архива[/grn] 'C:\\example\\readme.txt' >>> zipFile.extract('images/1.jpg') [grn]# извлекаем отдельный файл из директории images[/grn] 'C:\\example\\images\\1.jpg' >>> zipFile.extractall() [grn]# извлекаем весь архив в текущую директорию[/grn] >>> zipFile.extractall('archive') [grn]# извлекаем весь архив в директорию archive[/grn] >>> zipFile.close()
Функция zipfile.is_zipfile()
проверяет, является ли файл архивом или нет. Если да, то она вернет True
, если нет — False
.
# Копирует директорию со всем ее содержимым в # zip-файл с инкрементным номером в имени файла import zipfile, os def backupToZip(source, backup): """Создание резервной копии всего содержимого директории source""" # Проверить, что обе директории существуют if not (os.path.isabs(source) and os.path.isdir(source)): print('Директория %s не существует' % (source)) return if not (os.path.isabs(backup) and os.path.isdir(backup)): print('Директория %s не существует' % (backup)) return # Определить, какое имя файла будет у zip-архива, # исходя из имен уже существующих файлов number = 1 while True: name = os.path.basename(source) + '-' + str(number) + '.zip' backupFile = os.path.join(backup, name) if not os.path.isfile(backupFile): break number = number + 1 # Создание нового zip-файла print('Создание нового zip-файла %s...' % (backupFile)) zipFile = zipfile.ZipFile(backupFile, 'w') # Обход всего дерева директории и сжатие файлов в каждой папке archDirName = '' for dir, subdirs, files in os.walk(source): print('Добавление файлов из директории %s...' % (dir)) # Имя текущей директории в архиве archDirName = '/'.join([archDirName, os.path.basename(dir)]).strip('/') # Добавить в архив текущую директорию zipFile.write(dir, archDirName) # Добавить в архив все файлы из текущей директории for file in files: # Имя текущего файла в архиве archFileName = archDirName + '/' + file zipFile.write(os.path.join(dir, file), archFileName) zipFile.close() print('Готово') backupToZip('C:\\project', 'C:\\backup')
Поиск: Python • Web-разработка • zip • Модуль