diff options
author | Neal Norwitz <nnorwitz@gmail.com> | 2003-01-05 23:19:43 (GMT) |
---|---|---|
committer | Neal Norwitz <nnorwitz@gmail.com> | 2003-01-05 23:19:43 (GMT) |
commit | b9ef4aea5eac30cfdd56578f7225e6e6907b0055 (patch) | |
tree | 4f89d18e82250f6ddf99e6f1ad76345ec6fb00c2 /Doc/lib | |
parent | 6d23b170cf7c849e61195ebc2ede3bcd3428a909 (diff) | |
download | cpython-b9ef4aea5eac30cfdd56578f7225e6e6907b0055.zip cpython-b9ef4aea5eac30cfdd56578f7225e6e6907b0055.tar.gz cpython-b9ef4aea5eac30cfdd56578f7225e6e6907b0055.tar.bz2 |
SF #651082, tarfile module implementation from Lars Gustäbel
Diffstat (limited to 'Doc/lib')
-rw-r--r-- | Doc/lib/lib.tex | 1 | ||||
-rw-r--r-- | Doc/lib/libtarfile.tex | 450 |
2 files changed, 451 insertions, 0 deletions
diff --git a/Doc/lib/lib.tex b/Doc/lib/lib.tex index 0d202ac..ff4ff98 100644 --- a/Doc/lib/lib.tex +++ b/Doc/lib/lib.tex @@ -128,6 +128,7 @@ and how to embed it in other applications. \input{libcfgparser} \input{libfileinput} \input{libxreadlines} +\input{libtarfile} \input{libcalendar} \input{libcmd} \input{libshlex} diff --git a/Doc/lib/libtarfile.tex b/Doc/lib/libtarfile.tex new file mode 100644 index 0000000..a05a9f4 --- /dev/null +++ b/Doc/lib/libtarfile.tex @@ -0,0 +1,450 @@ +\section{\module{tarfile} --- Read and write tar archive files} + +\declaremodule{standard}{tarfile} +\modulesynopsis{Read and write tar-format archive files.} +\versionadded{2.3} + +\moduleauthor{Lars Gust\"abel}{lars@gustaebel.de} +\sectionauthor{Lars Gust\"abel}{lars@gustaebel.de} + +The \module{tarfile} module makes it possible to read and create tar archives. +Some facts and figures: + +\begin{itemize} +\item reads and writes \module{gzip} and \module{bzip2} compressed archives. +\item creates POSIX 1003.1-1990 compliant or GNU tar compatible archives. +\item reads GNU tar extensions \emph{longname}, \emph{longlink} and + \emph{sparse}. +\item stores pathnames of unlimited length using GNU tar extensions. +\item handles directories, regular files, hardlinks, symbolic links, fifos, + character devices and block devices and is able to acquire and + restore file information like timestamp, access permissions and owner. +\item can handle tape devices. +\end{itemize} + +\begin{funcdesc}{open}{\optional{name\optional{, mode + \optional{, fileobj\optional{, bufsize}}}}} + Return a \class{TarFile} object for the pathname \var{name}. + For detailed information on \class{TarFile} objects, + see \citetitle{TarFile Objects} (section \ref{tarfile-objects}). + + \var{mode} has to be a string of the form \code{'filemode[:compression]'}, + it defaults to \code{'r'}. Here is a full list of mode combinations: + + \begin{tableii}{c|l}{code}{mode}{action} + \lineii{'r'}{Open for reading with transparent compression (recommended).} + \lineii{'r:'}{Open for reading exclusively without compression.} + \lineii{'r:gz'}{Open for reading with gzip compression.} + \lineii{'r:bz2'}{Open for reading with bzip2 compression.} + \lineii{'a' or 'a:'}{Open for appending with no compression.} + \lineii{'w' or 'w:'}{Open for uncompressed writing.} + \lineii{'w:gz'}{Open for gzip compressed writing.} + \lineii{'w:bz2'}{Open for bzip2 compressed writing.} + \end{tableii} + + Note that \code{'a:gz'} or \code{'a:bz2'} is not possible. + If \var{mode} is not suitable to open a certain (compressed) file for + reading, \exception{ReadError} is raised. Use \var{mode} \code{'r'} to + avoid this. If a compression method is not supported, + \exception{CompressionError} is raised. + + If \var{fileobj} is specified, it is used as an alternative to + a file object opened for \var{name}. + + For special purposes, there is a second format for \var{mode}: + \code{'filemode|[compression]'}. \code{open} will return a \class{TarFile} + object that processes its data as a stream of blocks. No random + seeking will be done on the file. If given, \var{fileobj} may be any + object that has a \code{read()} resp. \code{write()} method. + \var{bufsize} specifies the blocksize and defaults to \code{20 * 512} + bytes. Use this variant in combination with e.g. \code{sys.stdin}, a socket + file object or a tape device. + However, such a \class{TarFile} object is limited in that it does not allow + to be accessed randomly, see \citetitle{Examples} (section + \ref{tar-examples}). + The currently possible modes: + + \begin{tableii}{c|l}{code}{mode}{action} + \lineii{'r|'}{Open a \emph{stream} of uncompressed tar blocks for reading.} + \lineii{'r|gz'}{Open a gzip compressed \emph{stream} for reading.} + \lineii{'r|bz2'}{Open a bzip2 compressed \emph{stream} for reading.} + \lineii{'w|'}{Open an uncompressed \emph{stream} for writing.} + \lineii{'w|gz'}{Open an gzip compressed \emph{stream} for writing.} + \lineii{'w|bz2'}{Open an bzip2 compressed \emph{stream} for writing.} + \end{tableii} +\end{funcdesc} + +\begin{classdesc*}{TarFile} + Class for reading and writing tar archives. Do not use this + class directly, better use \function{open()} instead. + See \citetitle{TarFile Objects} (section \ref{tarfile-objects}). +\end{classdesc*} + +\begin{funcdesc}{is_tarfile}{name} + Return \code{True} if \var{name} is a tar archive file, that the + \module{tarfile} module can read. +\end{funcdesc} + +\begin{classdesc}{TarFileCompat}{filename\optional{, mode\optional{, + compression}}} + + Class for limited access to tar archives with a \code{zipfile}-like + interface. Please consult the documentation of \code{zipfile} for more + details. + \code{compression} must be one of the following constants: + \begin{datadesc}{TAR_PLAIN} + Constant for an uncompressed tar archive. + \end{datadesc} + \begin{datadesc}{TAR_GZIPPED} + Constant for a \code{gzip} compressed tar archive. + \end{datadesc} +\end{classdesc} + +\begin{excdesc}{TarError} + Base class for all \module{tarfile} exceptions. +\end{excdesc} + +\begin{excdesc}{ReadError} + Is raised when a tar archive is opened, that either cannot be handled by + the \module{tarfile} module or is somehow invalid. +\end{excdesc} + +\begin{excdesc}{CompressionError} + Is raised when a compression method is not supported or when the data + cannot be decoded properly. +\end{excdesc} + +\begin{excdesc}{StreamError} + Is raised for the limitations that are typical for stream-like + \class{TarFile} objects. +\end{excdesc} + +\begin{excdesc}{ExtractError} + Is raised for \emph{non-fatal} errors when using \method{extract()}, but + only if \member{TarFile.errorlevel}\code{ == 2}. +\end{excdesc} + +\begin{seealso} + \seemodule[module-zipfile]{zipfile}{Documentation of the \code{zipfile} + standard module.} + + \seetitle[http://www.gnu.org/manual/tar/html_chapter/tar_8.html\#SEC118] + {GNU tar manual, Standard Section}{Documentation for tar archive files, + including GNU tar extensions.} +\end{seealso} + +%----------------- +% TarFile Objects +%----------------- + +\subsection{TarFile Objects \label{tarfile-objects}} + +The \class{TarFile} object provides an interface to a tar archive. A tar +archive is a sequence of blocks. An archive member (a stored file) is made up +of a header block followed by data blocks. It is possible, to store a file in a +tar archive several times. Each archive member is represented by a +\class{TarInfo} object, see \citetitle{TarInfo Objects} (section +\ref{tarinfo-objects}) for details. + +\begin{classdesc}{TarFile}{\optional{name + \optional{, mode\optional{, fileobj}}}} + Open an \emph{(uncompressed)} tar archive \var{name}. + \var{mode} is either \code{'r'} to read from an existing archive, + \code{'a'} to append data to an existing file or \code{'w'} to create a new + file overwriting an existing one. \var{mode} defaults to \code{'r'}. + + If \var{fileobj} is given, it is used for reading or writing data. + If it can be determined, \var{mode} is overridden by \var{fileobj}'s mode. + \begin{notice} + \var{fileobj} is not closed, when \class{TarFile} is closed. + \end{notice} +\end{classdesc} + +\begin{methoddesc}{open}{...} + Alternative constructor. The \function{open()} function on module level is + actually a shortcut to this classmethod. See section \ref{module-tarfile} + for details. +\end{methoddesc} + +\begin{methoddesc}{getmember}{name} + Return a \class{TarInfo} object for member \var{name}. If \var{name} can + not be found in the archive, \exception{KeyError} is raised. + \begin{notice} + If a member occurs more than once in the archive, its last + occurence is assumed to be the most up-to-date version. + \end{notice} +\end{methoddesc} + +\begin{methoddesc}{getmembers}{} + Return the members of the archive as a list of \class{TarInfo} objects. + The list has the same order as the members in the archive. +\end{methoddesc} + +\begin{methoddesc}{getnames}{} + Return the members as a list of their names. It has the same order as + the list returned by \method{getmembers()}. +\end{methoddesc} + +\begin{methoddesc}{list}{verbose=True} + Print a table of contents to \code{sys.stdout}. If \var{verbose} is + \code{False}, only the names of the members are printed. If it is + \code{True}, an \code{"ls -l"}-like output is produced. +\end{methoddesc} + +\begin{methoddesc}{next}{} + Return the next member of the archive as a \class{TarInfo} object, when + \class{TarFile} is opened for reading. Return \code{None} if there is no + more available. +\end{methoddesc} + +\begin{methoddesc}{extract}{member\optional{, path}} + Extract a member from the archive to the current working directory, + using its full name. Its file information is extracted as accurately as + possible. + \var{member} may be a filename or a \class{TarInfo} object. + You can specify a different directory using \var{path}. +\end{methoddesc} + +\begin{methoddesc}{extractfile}{member} + Extract a member from the archive as a file object. + \var{member} may be a filename or a \class{TarInfo} object. + If \var{member} is a regular file, a file-like object is returned. + If \var{member} is a link, a file-like object is constructed from the + link's target. + If \var{member} is none of the above, \code{None} is returned. + \begin{notice} + The file-like object is read-only and provides the following methods: + \method{read()}, \method{readline()}, \method{readlines()}, + \method{seek()}, \method{tell()}. + \end{notice} +\end{methoddesc} + +\begin{methoddesc}{add}{name\optional{, arcname\optional{, recursive=True}}} + Add the file \var{name} to the archive. \var{name} may be any type + of file (directory, fifo, symbolic link, etc.). + If given, \var{arcname} specifies an alternative name for the file in the + archive. Directories are added recursively by default. + This can be avoided by setting \var{recursive} to \code{False}. +\end{methoddesc} + +\begin{methoddesc}{addfile}{tarinfo\optional{, fileobj}} + Add the \class{TarInfo} object \var{tarinfo} to the archive. + If \var{fileobj} is given, \code{tarinfo.size} bytes are read + from it and added to the archive. You can create \class{TarInfo} objects + using \method{gettarinfo()}. + \begin{notice} + On Windows platforms, \var{fileobj} should always be opened with mode + \code{'rb'} to avoid irritation about the file size. + \end{notice} +\end{methoddesc} + +\begin{methoddesc}{gettarinfo}{\optional{name\optional{, arcname + \optional{, fileobj}}}} + Create a \class{TarInfo} object for either the file \var{name} or the + file object \var{fileobj} (using \code{os.fstat()} on its file descriptor). + You can modify some of the \class{TarInfo}'s attributes before you add it + using \method{addfile()}. + If given, \var{arcname} specifies an alternative name for the file in the + archive. +\end{methoddesc} + +\begin{methoddesc}{close}{} + Close the \class{TarFile}. In write-mode, two finishing zero blocks are + appended to the archive. +\end{methoddesc} + +\begin{memberdesc}{posix=True} + If \code{True}, create a POSIX 1003.1-1990 compliant archive. GNU + extensions are not used, because they are not part of the POSIX standard. + This limits the length of filenames to at most 256 and linknames to 100 + characters. A \exception{ValueError} is raised, if a pathname exceeds this + limit. + If \code{False}, create a GNU tar compatible archive. It will not be POSIX + compliant, but can store pathnames of unlimited length. +\end{memberdesc} + +\begin{memberdesc}{dereference=False} + If \code{False}, add symbolic and hard links to archive. If \code{True}, + add the content of the target files to the archive. This has no effect on + systems that do not support links. +\end{memberdesc} + +\begin{memberdesc}{ignore_zeros=False} + If \code{False}, treat an empty block as the end of the archive. If + \code{True}, skip empty (and invalid) blocks and try to get as many + members as possible. This is only useful for concatenated or damaged + archives. +\end{memberdesc} + +\begin{memberdesc}{debug=0} + To be set from \code{0}(no debug messages) up to \code{3}(all debug + messages). The messages are written to \code{sys.stdout}. +\end{memberdesc} + +\begin{memberdesc}{errorlevel=0} + If \code{0}, all errors are ignored when using \method{extract()}. + Nevertheless, they appear as error messages in the debug output, when + debugging is enabled. + If \code{1}, all \emph{fatal} errors are raised as \exception{OSError} + or \exception{IOError} exceptions. + If \code{2}, all \emph{non-fatal} errors are raised as \exception{TarError} + exceptions as well. +\end{memberdesc} + +%----------------- +% TarInfo Objects +%----------------- + +\subsection{TarInfo Objects \label{tarinfo-objects}} + +A \class{TarInfo} object represents one member in a \class{TarFile}. Aside from +storing all required attributes of a file (like file type, size, time, +permissions, owner etc.), it provides some useful methods to determine its +type. It does \emph{not} contain the file's data itself. + +\class{TarInfo} objects are returned by \code{TarFile}'s methods +\code{getmember()}, \code{getmembers()} and \code{gettarinfo()}. + +\begin{classdesc}{TarInfo}{\optional{name}} + Create a \class{TarInfo} object. +\end{classdesc} + +\begin{methoddesc}{frombuf}{} + Create and return a \class{TarInfo} object from a string buffer. +\end{methoddesc} + +\begin{methoddesc}{tobuf}{} + Create a string buffer from a \class{TarInfo} object. +\end{methoddesc} + +A \code{TarInfo} object has the following public data attributes: +\begin{memberdesc}{name} + Name of the archive member. +\end{memberdesc} + +\begin{memberdesc}{size} + Size in bytes. +\end{memberdesc} + +\begin{memberdesc}{mtime} + Time of last modification. +\end{memberdesc} + +\begin{memberdesc}{mode} + Permission bits. +\end{memberdesc} + +\begin{memberdesc}{type} + File type. + \var{type} is usually one of these constants: + \code{REGTYPE, AREGTYPE, LNKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, CONTTYPE, + CHRTYPE, BLKTYPE, GNUTYPE_SPARSE}. + To determine the type of a \class{TarInfo} object more conveniently, use + the \code{is_*()} methods below. +\end{memberdesc} + +\begin{memberdesc}{linkname} + Name of the target file name, which is only present in \class{TarInfo} + objects of type LNKTYPE and SYMTYPE. +\end{memberdesc} + +\begin{memberdesc}{uid, gid} + User and group ID of who originally stored this member. +\end{memberdesc} + +\begin{memberdesc}{uname, gname} + User and group name. +\end{memberdesc} + +A \class{TarInfo} object also provides some convenient query methods: +\begin{methoddesc}{isfile}{} + Return \code{True} if the \class{Tarinfo} object is a regular file. +\end{methoddesc} + +\begin{methoddesc}{isreg}{} + Same as \method{isfile()}. +\end{methoddesc} + +\begin{methoddesc}{isdir}{} + Return \code{True} if it is a directory. +\end{methoddesc} + +\begin{methoddesc}{issym}{} + Return \code{True} if it is a symbolic link. +\end{methoddesc} + +\begin{methoddesc}{islnk}{} + Return \code{True} if it is a hard link. +\end{methoddesc} + +\begin{methoddesc}{ischr}{} + Return \code{True} if it is a character device. +\end{methoddesc} + +\begin{methoddesc}{isblk}{} + Return \code{True} if it is a block device. +\end{methoddesc} + +\begin{methoddesc}{isfifo}{} + Return \code{True} if it is a FIFO. +\end{methoddesc} + +\begin{methoddesc}{isdev}{} + Return \code{True} if it is one of character device, block device or FIFO. +\end{methoddesc} + +%------------------------ +% Examples +%------------------------ + +\subsection{Examples \label{tar-examples}} + +How to create an uncompressed tar archive from a list of filenames: +\begin{verbatim} +import tarfile +tar = tarfile.open("sample.tar", "w") +for name in ["foo", "bar", "quux"]: + tar.add(name) +tar.close() +\end{verbatim} + +How to read a gzip compressed tar archive and display some member information: +\begin{verbatim} +import tarfile +tar = tarfile.open("sample.tar.gz", "r:gz") +for tarinfo in tar: + print tarinfo.name, "is", tarinfo.size, "bytes in size and is", + if tarinfo.isreg(): + print "a regular file." + elif tarinfo.isdir(): + print "a directory." + else: + print "something else." +tar.close() +\end{verbatim} + +How to create a tar archive with faked information: +\begin{verbatim} +import tarfile +tar = tarfile.open("sample.tar.gz", "w:gz") +for name in namelist: + tarinfo = tar.gettarinfo(name, "fakeproj-1.0/" + name) + tarinfo.uid = 123 + tarinfo.gid = 456 + tarinfo.uname = "johndoe" + tarinfo.gname = "fake" + tar.addfile(tarinfo, file(name)) +tar.close() +\end{verbatim} + +The \emph{only} way to extract an uncompressed tar stream from +\code{sys.stdin}: +\begin{verbatim} +import sys +import tarfile +tar = tarfile.open(mode="r|", fileobj=sys.stdin) +for tarinfo in tar: + tar.extract(tarinfo) +tar.close() +\end{verbatim} + |