Patch #1043890: tarfile: add extractall() method.
This commit is contained in:
parent
fd78a6f7f8
commit
00a73e7715
|
@ -196,12 +196,29 @@ tar archive several times. Each archive member is represented by a
|
||||||
more available.
|
more available.
|
||||||
\end{methoddesc}
|
\end{methoddesc}
|
||||||
|
|
||||||
|
\begin{methoddesc}{extractall}{\optional{path\optional{, members}}}
|
||||||
|
Extract all members from the archive to the current working directory
|
||||||
|
or directory \var{path}. If optional \var{members} is given, it must be
|
||||||
|
a subset of the list returned by \method{getmembers()}.
|
||||||
|
Directory informations like owner, modification time and permissions are
|
||||||
|
set after all members have been extracted. This is done to work around two
|
||||||
|
problems: A directory's modification time is reset each time a file is
|
||||||
|
created in it. And, if a directory's permissions do not allow writing,
|
||||||
|
extracting files to it will fail.
|
||||||
|
\versionadded{2.5}
|
||||||
|
\end{methoddesc}
|
||||||
|
|
||||||
\begin{methoddesc}{extract}{member\optional{, path}}
|
\begin{methoddesc}{extract}{member\optional{, path}}
|
||||||
Extract a member from the archive to the current working directory,
|
Extract a member from the archive to the current working directory,
|
||||||
using its full name. Its file information is extracted as accurately as
|
using its full name. Its file information is extracted as accurately as
|
||||||
possible.
|
possible.
|
||||||
\var{member} may be a filename or a \class{TarInfo} object.
|
\var{member} may be a filename or a \class{TarInfo} object.
|
||||||
You can specify a different directory using \var{path}.
|
You can specify a different directory using \var{path}.
|
||||||
|
\begin{notice}
|
||||||
|
Because the \method{extract()} method allows random access to a tar
|
||||||
|
archive there are some issues you must take care of yourself. See the
|
||||||
|
description for \method{extractall()} above.
|
||||||
|
\end{notice}
|
||||||
\end{methoddesc}
|
\end{methoddesc}
|
||||||
|
|
||||||
\begin{methoddesc}{extractfile}{member}
|
\begin{methoddesc}{extractfile}{member}
|
||||||
|
@ -416,6 +433,14 @@ A \class{TarInfo} object also provides some convenient query methods:
|
||||||
|
|
||||||
\subsection{Examples \label{tar-examples}}
|
\subsection{Examples \label{tar-examples}}
|
||||||
|
|
||||||
|
How to extract an entire tar archive to the current working directory:
|
||||||
|
\begin{verbatim}
|
||||||
|
import tarfile
|
||||||
|
tar = tarfile.open("sample.tar.gz")
|
||||||
|
tar.extractall()
|
||||||
|
tar.close()
|
||||||
|
\end{verbatim}
|
||||||
|
|
||||||
How to create an uncompressed tar archive from a list of filenames:
|
How to create an uncompressed tar archive from a list of filenames:
|
||||||
\begin{verbatim}
|
\begin{verbatim}
|
||||||
import tarfile
|
import tarfile
|
||||||
|
|
|
@ -1321,6 +1321,47 @@ class TarFile(object):
|
||||||
|
|
||||||
self.members.append(tarinfo)
|
self.members.append(tarinfo)
|
||||||
|
|
||||||
|
def extractall(self, path=".", members=None):
|
||||||
|
"""Extract all members from the archive to the current working
|
||||||
|
directory and set owner, modification time and permissions on
|
||||||
|
directories afterwards. `path' specifies a different directory
|
||||||
|
to extract to. `members' is optional and must be a subset of the
|
||||||
|
list returned by getmembers().
|
||||||
|
"""
|
||||||
|
directories = []
|
||||||
|
|
||||||
|
if members is None:
|
||||||
|
members = self
|
||||||
|
|
||||||
|
for tarinfo in members:
|
||||||
|
if tarinfo.isdir():
|
||||||
|
# Extract directory with a safe mode, so that
|
||||||
|
# all files below can be extracted as well.
|
||||||
|
try:
|
||||||
|
os.makedirs(os.path.join(path, tarinfo.name), 0777)
|
||||||
|
except EnvironmentError:
|
||||||
|
pass
|
||||||
|
directories.append(tarinfo)
|
||||||
|
else:
|
||||||
|
self.extract(tarinfo, path)
|
||||||
|
|
||||||
|
# Reverse sort directories.
|
||||||
|
directories.sort(lambda a, b: cmp(a.name, b.name))
|
||||||
|
directories.reverse()
|
||||||
|
|
||||||
|
# Set correct owner, mtime and filemode on directories.
|
||||||
|
for tarinfo in directories:
|
||||||
|
path = os.path.join(path, tarinfo.name)
|
||||||
|
try:
|
||||||
|
self.chown(tarinfo, path)
|
||||||
|
self.utime(tarinfo, path)
|
||||||
|
self.chmod(tarinfo, path)
|
||||||
|
except ExtractError, e:
|
||||||
|
if self.errorlevel > 1:
|
||||||
|
raise
|
||||||
|
else:
|
||||||
|
self._dbg(1, "tarfile: %s" % e)
|
||||||
|
|
||||||
def extract(self, member, path=""):
|
def extract(self, member, path=""):
|
||||||
"""Extract a member from the archive to the current working directory,
|
"""Extract a member from the archive to the current working directory,
|
||||||
using its full name. Its file information is extracted as accurately
|
using its full name. Its file information is extracted as accurately
|
||||||
|
|
|
@ -75,6 +75,8 @@ Extension Modules
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Patch #1043890: Add extractall method to tarfile.
|
||||||
|
|
||||||
- Patch #1075887: Don't require MSVC in distutils if there is nothing
|
- Patch #1075887: Don't require MSVC in distutils if there is nothing
|
||||||
to build.
|
to build.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue