Я изо всех сил пытался распаковать / распаковать / распаковать zip-файлы с помощью Python, и что «низкоуровневый подход« создать объект ZipFile, перебрать его .namelist (), прочитать файлы и записать их в файловую систему ») кажется очень питоном. Поэтому я начал копать объекты zipfile , которые, как мне кажется, не очень хорошо документированы и охватывали все методы объекта:
>>> from zipfile import ZipFile
>>> filepath = '/srv/pydocfiles/packages/ebook.zip'
>>> zip = ZipFile(filepath)
>>> dir(zip)
['NameToInfo', '_GetContents', '_RealGetContents', '__del__', '__doc__', '__enter__', '__exit__', '__init__', '__module__', '_allowZip64', '_didModify', '_extract_member', '_filePassed', '_writecheck', 'close', 'comment', 'compression', 'debug', 'extract', 'extractall', 'filelist', 'filename', 'fp', 'getinfo', 'infolist', 'mode', 'namelist', 'open', 'printdir', 'pwd', 'read', 'setpassword', 'start_dir', 'testzip', 'write', 'writestr']
Здесь мы используем метод "extractall", который работает так же, как extractall из tarfile ! (на python 2.6 и 2.7, но НЕ 2.5)
Тогда производительность касается; файл ebook.zip имеет размер 84,6 МБ (в основном PDF-файлы), а размер несжатой папки - 103 МБ. По умолчанию архивируется «Утилита архивирования» в MacOSx 10.5. Я сделал то же самое с модулем Python timeit :
>>> from timeit import Timer
>>> t = Timer("filepath = '/srv/pydocfiles/packages/ebook.zip'; \
... extract_to = '/tmp/pydocnet/build'; \
... from zipfile import ZipFile; \
... ZipFile(filepath).extractall(path=extract_to)")
>>>
>>> t.timeit(1)
1.8670060634613037
, что заняло менее 2 секунд на сильно загруженном компьютере с 90% памяти, который используется другими приложениями.
Надеюсь, это кому-нибудь поможет.