Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions Doc/library/gzip.rst
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ Note that additional file formats which can be decompressed by the
The module defines the following items:


.. function:: open(filename, mode='rb', compresslevel=6, encoding=None, errors=None, newline=None)
.. function:: open(filename, mode='rb', compresslevel=6, encoding=None, errors=None, newline=None, *, mtime=None)
Comment thread
ellaellela marked this conversation as resolved.

Open a gzip-compressed file in binary or text mode, returning a :term:`file
object`.
Expand All @@ -43,9 +43,12 @@ The module defines the following items:
The *compresslevel* argument is an integer from 0 to 9, as for the
:class:`GzipFile` constructor.

The keyword-only argument *mtime* represents a Unix timestamp.

For binary mode, this function is equivalent to the :class:`GzipFile`
constructor: ``GzipFile(filename, mode, compresslevel)``. In this case, the
*encoding*, *errors* and *newline* arguments must not be provided.
constructor: ``GzipFile(filename, mode, compresslevel, mtime=mtime)``.
In this case, the *encoding*, *errors* and *newline* arguments must not
be provided.

For text mode, a :class:`GzipFile` object is created, and wrapped in an
:class:`io.TextIOWrapper` instance with the specified encoding, error
Expand All @@ -66,6 +69,10 @@ The module defines the following items:
It is the default level used by most compression tools and a better
tradeoff between speed and performance.

.. versionchanged:: next
Added keyword-only argument *mtime* which is passed to the class
constructor of :class:`~gzip.GzipFile`.

.. exception:: BadGzipFile

An exception raised for invalid gzip files. It inherits from :exc:`OSError`.
Expand Down
8 changes: 8 additions & 0 deletions Doc/whatsnew/3.16.rst
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,14 @@ New modules
Improved modules
================


gzip
----

* :func:`gzip.open` now accepts an optional argument ``mtime``
which is passed on to the constructor of the :class:`~gzip.GzipFile` class.
(Contributed by Marin Misur in :gh:`91372`.)

os
--

Expand Down
7 changes: 4 additions & 3 deletions Lib/gzip.py
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@


def open(filename, mode="rb", compresslevel=_COMPRESS_LEVEL_TRADEOFF,
encoding=None, errors=None, newline=None):
encoding=None, errors=None, newline=None, *, mtime=None):
"""Open a gzip-compressed file in binary or text mode.

The filename argument can be an actual filename (a str or bytes object), or
Expand Down Expand Up @@ -63,9 +63,10 @@ def open(filename, mode="rb", compresslevel=_COMPRESS_LEVEL_TRADEOFF,

gz_mode = mode.replace("t", "")
if isinstance(filename, (str, bytes, os.PathLike)):
binary_file = GzipFile(filename, gz_mode, compresslevel)
binary_file = GzipFile(filename, gz_mode, compresslevel, mtime=mtime)
elif hasattr(filename, "read") or hasattr(filename, "write"):
binary_file = GzipFile(None, gz_mode, compresslevel, filename)
binary_file = GzipFile(None, gz_mode, compresslevel, filename,
mtime=mtime)
else:
raise TypeError("filename must be a str or bytes object, or a file")

Expand Down
11 changes: 11 additions & 0 deletions Lib/test/test_gzip.py
Original file line number Diff line number Diff line change
Expand Up @@ -351,6 +351,17 @@ def test_mtime(self):
self.assertEqual(dataRead, data1)
self.assertEqual(fRead.mtime, mtime)

def test_mtime_with_open(self):
mtime = 123456789
with gzip.open(self.filename, "wb", mtime=mtime) as fWrite:
fWrite.write(data1)
with gzip.open(self.filename, "rb") as fRead:
self.assertTrue(hasattr(fRead, 'mtime'))
self.assertIsNone(fRead.mtime)
dataRead = fRead.read()
self.assertEqual(dataRead, data1)
self.assertEqual(fRead.mtime, mtime)

def test_mtime_out_of_range(self):
for mtime in (-1, 2**32):
with gzip.GzipFile(self.filename, 'w', mtime=mtime) as fWrite:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Added *mtime* option to :func:`gzip.open`, which will be passed
to the constructor of :class:`~gzip.GzipFile`.
Loading