import zipfile pzf = zipfile.PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, optimize=-1)
file
- имя ZIP-файла,mode='r'
- режим открытия ZIP-файла,compression=ZIP_STORED
- метод/алгоритм сжатия,allowZip64=True
- расширение ZIP64
,optimize=-1
- оптимизация.PyZipFile
.Класс PyZipFile()
модуля zipfile
работает с исполняемыми архивами-приложениями Python.
Конструктор класса zipfile.PyZipFile
принимает те же параметры, что и конструктор zipfile.ZipFile
и один дополнительный параметр - optimize
.
Объекты PyZipFile
имеют один метод в дополнение к методам объекта ZipFile
:
PyZipFile.writepy(pathname, basename='', filterfunc=None)
:Дополнительный метод PyZipFile.writepy()
ищет соответствующий файл *.py
и добавляет его в архив-приложение.
Если аргумент optimize
для zipfile.PyZipFile()
не задан или равен -1, соответствующий файл представляет собой файл *.pyc
, компилируемый при необходимости.
Если аргумент optimize
был задан как 0, 1 или 2, в архив добавляются только файлы с таким уровнем оптимизации, которые компилируются при необходимости. Более подробно смотрите встроенную функцию compile()
.
Если аргумент pathname
является файлом, то имя файла должно заканчиваться на .py
и на верхнем уровне добавляется соответствующий *.pyc
файл без информации о пути. Если pathname
- это файл, который не заканчивается на .py
, будет вызвано исключение RuntimeError
. Если это каталог и каталог не является каталогом пакета, то все файлы *.pyc
добавляются на верхнем уровне. Если каталог является каталогом пакета, то все *.pyc
добавляются под именем пакета в качестве пути к файлу и если какие-либо подкаталоги являются каталогами пакетов, все они добавляются рекурсивно в отсортированном порядке.
Аргумент basename
предназначен только для внутреннего использования.
Если указан аргумент filterfunc
, то это должна быть функция, принимающая один строковый аргумент. Перед передачей файлов в архив, функции будет передан каждый путь, включая каждый отдельный полный путь к файлу. Если filterfunc
возвращает ложное значение, то путь не будет добавлен, а если это каталог, его содержимое будет игнорироваться.
Например, если все тестовые файлы находятся в тестовых каталогах или начинаются со строки test_
, то можно использовать filterfunc
, чтобы исключить их:
>>> zf = PyZipFile('myprog.zip') >>> def notests(s): ... fn = os.path.basename(s) ... return (not (fn == 'test' or fn.startswith('test_'))) >>> zf.writepy('myprog', filterfunc=notests)
Метод PyZipFile.writepy()
создает архивы с именами файлов:
string.pyc # Имя верхнего уровня test/__init__.pyc # Каталог пакетов test/testall.pyc # Модуль test.testall test/bogus/__init__.pyc # Каталог подпакетов test/bogus/myfile.pyc # Подмодуль test.bogus.myfile