Issue 6003: ZipFile.writestr "compression_type" argument

This commit is contained in:
Ronald Oussoren 2010-02-07 20:18:02 +00:00
parent 2bd52dcccb
commit dd25e86cf4
4 changed files with 30 additions and 2 deletions

View File

@ -284,7 +284,7 @@ ZipFile Objects
byte, the name of the file in the archive will be truncated at the null byte. byte, the name of the file in the archive will be truncated at the null byte.
.. method:: ZipFile.writestr(zinfo_or_arcname, bytes) .. method:: ZipFile.writestr(zinfo_or_arcname, bytes[, compress_type])
Write the string *bytes* to the archive; *zinfo_or_arcname* is either the file Write the string *bytes* to the archive; *zinfo_or_arcname* is either the file
name it will be given in the archive, or a :class:`ZipInfo` instance. If it's name it will be given in the archive, or a :class:`ZipInfo` instance. If it's
@ -294,6 +294,10 @@ ZipFile Objects
created with mode ``'r'`` will raise a :exc:`RuntimeError`. Calling created with mode ``'r'`` will raise a :exc:`RuntimeError`. Calling
:meth:`writestr` on a closed ZipFile will raise a :exc:`RuntimeError`. :meth:`writestr` on a closed ZipFile will raise a :exc:`RuntimeError`.
If given, *compress_type* overrides the value given for the *compression*
parameter to the constructor for the new entry, or in the *zinfo_or_arcname*
(if that is a :class:`ZipInfo` instance).
.. note:: .. note::
When passing a :class:`ZipInfo` instance as the *zinfo_or_acrname* parameter, When passing a :class:`ZipInfo` instance as the *zinfo_or_acrname* parameter,
@ -301,6 +305,9 @@ ZipFile Objects
member of the given :class:`ZipInfo` instance. By default, the member of the given :class:`ZipInfo` instance. By default, the
:class:`ZipInfo` constructor sets this member to :const:`ZIP_STORED`. :class:`ZipInfo` constructor sets this member to :const:`ZIP_STORED`.
.. versionchanged:: 2.7
The *compression_type* argument.
The following data attributes are also available: The following data attributes are also available:

View File

@ -408,6 +408,20 @@ class TestsWithSourceFile(unittest.TestCase):
# remove the test file subdirectories # remove the test file subdirectories
shutil.rmtree(os.path.join(os.getcwd(), 'ziptest2dir')) shutil.rmtree(os.path.join(os.getcwd(), 'ziptest2dir'))
def test_writestr_compression(self):
zipfp = zipfile.ZipFile(TESTFN2, "w")
zipfp.writestr("a.txt", "hello world", compress_type=zipfile.ZIP_STORED)
if zlib:
zipfp.writestr("b.txt", "hello world", compress_type=zipfile.ZIP_DEFLATED)
info = zipfp.getinfo('a.txt')
self.assertEqual(info.compress_type, zipfile.ZIP_STORED)
if zlib:
info = zipfp.getinfo('b.txt')
self.assertEqual(info.compress_type, zipfile.ZIP_DEFLATED)
def zip_test_writestr_permissions(self, f, compression): def zip_test_writestr_permissions(self, f, compression):
# Make sure that writestr creates files with mode 0600, # Make sure that writestr creates files with mode 0600,
# when it is passed a name rather than a ZipInfo instance. # when it is passed a name rather than a ZipInfo instance.

View File

@ -1063,13 +1063,14 @@ class ZipFile:
self.filelist.append(zinfo) self.filelist.append(zinfo)
self.NameToInfo[zinfo.filename] = zinfo self.NameToInfo[zinfo.filename] = zinfo
def writestr(self, zinfo_or_arcname, bytes): def writestr(self, zinfo_or_arcname, bytes, compress_type=None):
"""Write a file into the archive. The contents is the string """Write a file into the archive. The contents is the string
'bytes'. 'zinfo_or_arcname' is either a ZipInfo instance or 'bytes'. 'zinfo_or_arcname' is either a ZipInfo instance or
the name of the file in the archive.""" the name of the file in the archive."""
if not isinstance(zinfo_or_arcname, ZipInfo): if not isinstance(zinfo_or_arcname, ZipInfo):
zinfo = ZipInfo(filename=zinfo_or_arcname, zinfo = ZipInfo(filename=zinfo_or_arcname,
date_time=time.localtime(time.time())[:6]) date_time=time.localtime(time.time())[:6])
zinfo.compress_type = self.compression zinfo.compress_type = self.compression
zinfo.external_attr = 0600 << 16 zinfo.external_attr = 0600 << 16
else: else:
@ -1079,6 +1080,9 @@ class ZipFile:
raise RuntimeError( raise RuntimeError(
"Attempt to write to ZIP archive that was already closed") "Attempt to write to ZIP archive that was already closed")
if compress_type is not None:
zinfo.compress_type = compress_type
zinfo.file_size = len(bytes) # Uncompressed size zinfo.file_size = len(bytes) # Uncompressed size
zinfo.header_offset = self.fp.tell() # Start of header bytes zinfo.header_offset = self.fp.tell() # Start of header bytes
self._writecheck(zinfo) self._writecheck(zinfo)

View File

@ -15,6 +15,9 @@ Core and Builtins
Library Library
------- -------
- Issue #6003: add an argument to ``zipfile.Zipfile.writestr`` to
specify the compression type.
What's New in Python 2.7 alpha 3? What's New in Python 2.7 alpha 3?
================================= =================================