mirror of https://github.com/python/cpython
Issue 6003: ZipFile.writestr "compression_type" argument
This commit is contained in:
parent
2bd52dcccb
commit
dd25e86cf4
|
@ -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:
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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?
|
||||||
=================================
|
=================================
|
||||||
|
|
Loading…
Reference in New Issue