``'w|bz2'``, :func:`tarfile.open` accepts the keyword argument
*compresslevel* (default ``9``) to specify the compression level of the file.
- For modes ``'w:xz'`` and ``'x:xz'``, :func:`tarfile.open` accepts the
+ For modes ``'w:xz'``, ``'x:xz'`` and ``'w|xz'``, :func:`tarfile.open` accepts the
keyword argument *preset* to specify the compression level of the file.
For special purposes, there is a second format for *mode*:
.. versionchanged:: 3.12
The *compresslevel* keyword argument also works for streams.
+ .. versionchanged:: next
+ The *preset* keyword argument also works for streams.
+
.. class:: TarFile
:noindex:
"""
def __init__(self, name, mode, comptype, fileobj, bufsize,
- compresslevel):
+ compresslevel, preset):
"""Construct a _Stream object.
"""
self._extfileobj = True
self.cmp = lzma.LZMADecompressor()
self.exception = lzma.LZMAError
else:
- self.cmp = lzma.LZMACompressor()
+ self.cmp = lzma.LZMACompressor(preset=preset)
elif comptype != "tar":
raise CompressionError("unknown compression type %r" % comptype)
if filemode not in ("r", "w"):
raise ValueError("mode must be 'r' or 'w'")
+ if "compresslevel" in kwargs and comptype not in ("gz", "bz2"):
+ raise ValueError(
+ "compresslevel is only valid for w|gz and w|bz2 modes"
+ )
+ if "preset" in kwargs and comptype not in ("xz",):
+ raise ValueError("preset is only valid for w|xz mode")
compresslevel = kwargs.pop("compresslevel", 9)
+ preset = kwargs.pop("preset", None)
stream = _Stream(name, filemode, comptype, fileobj, bufsize,
- compresslevel)
+ compresslevel, preset)
try:
t = cls(name, filemode, stream, **kwargs)
except: