zip_open 0.2.0
file open from nested zip file archive.
License: Apache License 2.0
Keywords: zip file open

`zip_open` open file from nested zip file archive.

If you use static file like as 'data.zip' and open this from your
python code, Your program will become like
``open(os.path.join(os.path.dirname(__file__), 'data.zip'))``.
But if your packages are packed into packages.zip file (zipped-egg,
or cases to gather in one file on Google App Engine matter), your
code doesn't work fine.

In this situation, the file path of data.zip becomes
`/path/to/packages.zip/data.zip`, then your program can't open the
data.zip file.

`zip_open` package solves this problem.


Features
--------

* Open file from nested zip archive file path/name.
* Open file from nested zip archive file-like-object.


Using sample1: open the file from zip file
------------------------------------------

packages1.zip is::

   packages1.zip
     + file1.txt

Open file1.txt::

   >>> from zip_open import zopen
   >>> fobj = zopen('packages1.zip/file1.txt')
   >>> data = fobj.read()
   >>> print(data)
   I am file1.txt, ok.

You can specifiy zopen subpath args::

   >>> fobj = zopen('packages1.zip', 'file1.txt')
   >>> print(fobj.read())
   I am file1.txt, ok.

These code samples equivalent to below code::

   >>> from zipfile import ZipFile
   >>> zipobj = ZipFile('packages1.zip')
   >>> data = zipobj.read('file1.txt')
   >>> print(data)
   I am file1.txt, ok.


Using sample2: open the file from nested zip file
-------------------------------------------------

packages2.zip is::

   packages2.zip
     + data2.zip
        + file2.txt

Open file2.txt::

   >>> from zip_open import zopen
   >>> fobj = zopen('packages2.zip/data2.zip/file2.txt')
   >>> print(fobj.read())
   I am file2.txt, ok.


If you want to open from file-like-object, you can call::

   >>> zip_fileobj = open('packages2.zip', 'rb')
   >>> fobj = zopen(zip_fileobj, 'data2.zip/file2.txt')
   >>> print(fobj.read())
   I am file2.txt, ok.

then you also call::

   >>> from StringIO import StringIO
   >>> zip_payload = open('packages2.zip', 'rb').read()
   >>> zip_fileobj = StringIO(zip_payload)
   >>> fobj = zopen(zip_fileobj, 'data2.zip/file2.txt')
   >>> print(fobj.read())
   I am file2.txt, ok.


Using sample3: open the file included in package oneself
--------------------------------------------------------

packages3.zip is::

   packages3.zip
     + foo.py
     + file1.txt
     + data3.zip
        + file3.txt

foo.py::

   import os
   from zip_open import zopen

   def loader(filename):
       fobj = zopen(os.path.join(os.path.dirname(__file__), filename))
       return fobj


execute loader() from interactive shell::

   >>> import sys
   >>> sys.path.insert(0, 'packages3.zip')
   >>> import foo
   >>> fobj = foo.loader('file1.txt')
   >>> print(fobj.read())
   I am file1.txt, ok.
   >>> fobj = foo.loader('data3.zip/file3.txt')
   >>> print(fobj.read())
   I am file3.txt, ok.


Requirements and dependencies
------------------------------

* Requirement: Python 2.4 or later
* Dependency: Nothing.


ToDo
-----
* Add tar.gz file support.
* Add using sample document for egg archive.
* Support Python3
* Add module import feature.


History
-------

0.2.1 (Unreleased)
~~~~~~~~~~~~~~~~~~
* fixed: test broken (open file as binary)
* use distutils.core.setup if no setuptools.

0.2.0 (2011-11-29)
~~~~~~~~~~~~~~~~~~
* Change license from PSL to Apache License 2.0
* Add feature: open from file-like-object.


0.1.0 (2010-7-19)
~~~~~~~~~~~~~~~~~~
* first release