\section{\module{zipfile} --- Work with ZIP archives} \modulesynopsis{Read and write ZIP-format archive files.} \moduleauthor{James C. Ahlstrom}{jim@interet.com} \sectionauthor{James C. Ahlstrom}{jim@interet.com} % LaTeX markup by Fred L. Drake, Jr. The ZIP file format is a common archive and compression standard. This module provides tools to create, read, write, append, and list a ZIP file. The available attributes of this module are: \begin{excdesc}{error} The error raised for bad ZIP files. \end{excdesc} \begin{datadesc}{_debug} Level of printing, defaults to \code{1}. \end{datadesc} \begin{classdesc}{ZipFile}{...} The class for reading and writing ZIP files. See ``\citetitle{ZipFile Objects}'' (section \ref{zipfile-objects}) for constructor details. \end{classdesc} \begin{funcdesc}{is_zipfile}{path} Returns true if \var{path} is a valid ZIP file based on its magic number, otherwise returns false. This module does not currently handle ZIP files which have appended comments. \end{funcdesc} \begin{funcdesc}{zip2date}{zdate} Return \code{(\var{year}, \var{month}, \var{day})} for a ZIP date code. \end{funcdesc} \begin{funcdesc}{zip2time}{ztime} Return \code{(\var{hour}, \var{minute}, \var{second})} for a ZIP time code. \end{funcdesc} \begin{funcdesc}{date2zip}{year, month, day} Return a ZIP date code. \end{funcdesc} \begin{funcdesc}{time2zip}{hour, minute, second} Return a ZIP time code. \end{funcdesc} \begin{datadesc}{ZIP_STORED} The numeric constant (\code{0}) for an uncompressed archive member. \end{datadesc} \begin{datadesc}{ZIP_DEFLATED} The numeric constant for the usual ZIP compression method. This requires the zlib module. No other compression methods are currently supported. \end{datadesc} \begin{seealso} \seetext{XXX point to ZIP format definition} \seetext{XXX point to Info-ZIP home page; mention WiZ} \end{seealso} \subsection{ZipFile Objects \label{zipfile-objects}} \begin{classdesc}{ZipFile}{filename\optional{, mode\optional{, compression}}} Open a ZIP file named \var{filename}. The \var{mode} parameter should be \code{'r'} to read an existing file, \code{'w'} to truncate and write a new file, or \code{'a'} to append to an existing file. For \var{mode} is \code{'a'} and \var{filename} refers to an existing ZIP file, then additional files are added to it. If \var{filename} does not refer to a ZIP file, then a new ZIP archive is appended to the file. This is meant for adding a ZIP archive to another file, such as \file{python.exe}. Using \begin{verbatim} cat myzip.zip >> python.exe \end{verbatim} also works, and at least \program{WinZip} can read such files. \var{compression} is the ZIP compression method to use when writing the archive, and should be \constant{ZIP_STORED} or \constant{ZIP_DEFLATED}; unrecognized values will cause \exception{ValueError} to be raised. The default is \constant{ZIP_STORED}. \end{classdesc} XXX explain the "extra" string for the ZIP format \begin{memberdesc}{TOC} A read-only dictionary whose keys are the names in the archive, and whose values are tuples as follows: \begin{tableii}{c|l}{code}{Index}{Meaning} \lineii{0}{File data seek offset} \lineii{1}{ZIP file "extra" data as a string} \lineii{2}{ZIP file bit flags} \lineii{3}{ZIP file compression type} \lineii{4}{File modification time in DOS format} \lineii{5}{File modification date in DOS format} \lineii{6}{The CRC-32 of the uncompressed data} \lineii{7}{The compressed size of the file} \lineii{8}{The uncompressed size of the file} \end{tableii} \end{memberdesc} The class ZipFile has these methods: \begin{methoddesc}{listdir}{} Return a list of names in the archive. Equivalent to \code{\var{zipfile}.TOC.keys()}. \end{methoddesc} \begin{methoddesc}{printdir}{} Print a table of contents for the archive to stdout. \end{methoddesc} \begin{methoddesc}{read}{name} Return the bytes of the file in the archive. The archive must be open for read or append. \end{methoddesc} \begin{methoddesc}{writestr}{bytes, arcname, year, month, day, hour, minute, second\optional{, extra}} Write the string \var{bytes} and the other data to the archive, and give the archive member the name \var{arcname}. \var{extra} is the ZIP extra data string. The archive must be opened with mode \code{'w'} or \code{'a'}. \end{methoddesc} \begin{methoddesc}{write}{filename, arcname\optional{, extra}} Write the file named \var{filename} to the archive, giving it the archive name \var{arcname}. \var{extra} is the ZIP extra data string. The archive must be open with mode \code{'w'} or \code{'a'}. \end{methoddesc} \begin{methoddesc}{writepy}{pathname\optional{, basename}} Search for files \file{*.py} and add the corresponding file to the archive. The corresponding file is a \file{*.pyo} file if available, else a \file{*.pyc} file, compiling if necessary. If the pathname is a file, the filename must end with \file{.py}, and just the (corresponding \file{*.py[oc]}) file is added at the top level (no path information). If it is a directory, and the directory is not a package directory, then all the files \file{*.py[oc]} are added at the top level. If the directory is a package directory, then all \file{*.py[oc]} are added under the package name as a file path, and if any subdirectories are package directories, all of these are added recursively. \var{basename} is intended for internal use only. The \method{writepy()} method makes archives with file names like this: \begin{verbatim} string.pyc # Top level name test/__init__.pyc # Package directory test/testall.pyc # Module test.testall test/bogus/__init__.pyc # Subpackage directory test/bogus/myfile.pyc # Submodule test.bogus.myfile \end{verbatim} \end{methoddesc} \begin{methoddesc}{close}{} Close the archive file. You must call \method{close()} before exiting your program or essential records will not be written. \end{methoddesc}