cpython: b512780c6589 (original) (raw)
Mercurial > cpython
changeset 104287:b512780c6589 3.6
Issue #28229: lzma module now supports pathlib [#28229]
Berker Peksag berker.peksag@gmail.com | |
---|---|
date | Tue, 04 Oct 2016 20:41:20 +0300 |
parents | 3a7234d04fe9 |
children | de398937653b 99c37fa72b66 |
files | Doc/library/lzma.rst Lib/lzma.py Lib/test/test_lzma.py Misc/NEWS |
diffstat | 4 files changed, 47 insertions(+), 13 deletions(-)[+] [-] Doc/library/lzma.rst 18 Lib/lzma.py 18 Lib/test/test_lzma.py 22 Misc/NEWS 2 |
line wrap: on
line diff
--- a/Doc/library/lzma.rst +++ b/Doc/library/lzma.rst @@ -39,8 +39,9 @@ Reading and writing compressed files object`. The filename argument can be either an actual file name (given as a
- :class:
str
or :class:bytes
object), in which case the named file is - opened, or it can be an existing file object to read from or write to.
- :class:
str
, :class:bytes
or :term:path-like object
object), in - which case the named file is opened, or it can be an existing file object
- to read from or write to.
The mode argument can be any of
"r"
,"rb"
,"w"
,"wb"
,"x"
,"xb"
,"a"
or"ab"
for binary mode, or"rt"
, @@ -64,6 +65,9 @@ Reading and writing compressed files .. versionchanged:: 3.4 Added support for the"x"
,"xb"
and"xt"
modes. - .. versionchanged:: 3.6
Accepts a :term:`path-like object`.[](#l1.20)
+
.. class:: LZMAFile(filename=None, mode="r", *, format=None, check=-1, preset=None, filters=None)
@@ -71,9 +75,10 @@ Reading and writing compressed files
An :class:LZMAFile
can wrap an already-open :term:file object
, or operate
directly on a named file. The filename argument specifies either the file
- object to wrap, or the name of the file to open (as a :class:
str
or - :class:
bytes
object). When wrapping an existing file object, the wrapped - file will not be closed when the :class:
LZMAFile
is closed.
- object to wrap, or the name of the file to open (as a :class:
str
, - :class:
bytes
or :term:path-like object
object). When wrapping an - existing file object, the wrapped file will not be closed when the
- :class:
LZMAFile
is closed. The mode argument can be either"r"
for reading (default),"w"
for overwriting,"x"
for exclusive creation, or"a"
for appending. These @@ -118,6 +123,9 @@ Reading and writing compressed files The :meth:~io.BufferedIOBase.read
method now accepts an argument ofNone
. - .. versionchanged:: 3.6
Accepts a :term:`path-like object`.[](#l1.44)
+ Compressing and decompressing data in memory --------------------------------------------
--- a/Lib/lzma.py +++ b/Lib/lzma.py @@ -23,6 +23,7 @@ container formats, as well as raw compre import builtins import io +import os from _lzma import * from _lzma import _encode_filter_properties, _decode_filter_properties import _compression @@ -49,9 +50,10 @@ class LZMAFile(_compression.BaseStream): format=None, check=-1, preset=None, filters=None): """Open an LZMA-compressed file in binary mode.
filename can be either an actual file name (given as a str or[](#l2.15)
bytes object), in which case the named file is opened, or it can[](#l2.16)
be an existing file object to read from or write to.[](#l2.17)
filename can be either an actual file name (given as a str,[](#l2.18)
bytes, or PathLike object), in which case the named file is[](#l2.19)
opened, or it can be an existing file object to read from or[](#l2.20)
write to.[](#l2.21)
mode can be "r" for reading (default), "w" for (over)writing, "x" for creating exclusively, or "a" for appending. These can @@ -112,7 +114,7 @@ class LZMAFile(_compression.BaseStream): else: raise ValueError("Invalid mode: {!r}".format(mode))
if isinstance(filename, (str, bytes)):[](#l2.29)
if isinstance(filename, (str, bytes, os.PathLike)):[](#l2.30) if "b" not in mode:[](#l2.31) mode += "b"[](#l2.32) self._fp = builtins.open(filename, mode)[](#l2.33)
@@ -122,7 +124,7 @@ class LZMAFile(_compression.BaseStream): self._fp = filename self._mode = mode_code else:
raise TypeError("filename must be a str or bytes object, or a file")[](#l2.38)
raise TypeError("filename must be a str, bytes, file or PathLike object")[](#l2.39)
if self._mode == _MODE_READ: raw = _compression.DecompressReader(self._fp, LZMADecompressor, @@ -263,9 +265,9 @@ def open(filename, mode="rb", *, encoding=None, errors=None, newline=None): """Open an LZMA-compressed file in binary or text mode.
- filename can be either an actual file name (given as a str or bytes
- object), in which case the named file is opened, or it can be an
- existing file object to read from or write to.
- filename can be either an actual file name (given as a str, bytes,
- or PathLike object), in which case the named file is opened, or it
- can be an existing file object to read from or write to.
The mode argument can be "r", "rb" (default), "w", "wb", "x", "xb", "a", or "ab" for binary mode, or "rt", "wt", "xt", or "at" for text
--- a/Lib/test/test_lzma.py +++ b/Lib/test/test_lzma.py @@ -1,6 +1,7 @@ import _compression from io import BytesIO, UnsupportedOperation, DEFAULT_BUFFER_SIZE import os +import pathlib import pickle import random import unittest @@ -488,6 +489,16 @@ class FileTestCase(unittest.TestCase): with LZMAFile(BytesIO(), "a") as f: pass
- def test_init_with_PathLike_filename(self):
filename = pathlib.Path(TESTFN)[](#l3.16)
with TempFile(filename, COMPRESSED_XZ):[](#l3.17)
with LZMAFile(filename) as f:[](#l3.18)
self.assertEqual(f.read(), INPUT)[](#l3.19)
with LZMAFile(filename, "a") as f:[](#l3.20)
f.write(INPUT)[](#l3.21)
with LZMAFile(filename) as f:[](#l3.22)
self.assertEqual(f.read(), INPUT * 2)[](#l3.23)
+ def test_init_with_filename(self): with TempFile(TESTFN, COMPRESSED_XZ): with LZMAFile(TESTFN) as f: @@ -1180,6 +1191,17 @@ class OpenTestCase(unittest.TestCase): with lzma.open(TESTFN, "rb") as f: self.assertEqual(f.read(), INPUT * 2)
- def test_with_pathlike_filename(self):
filename = pathlib.Path(TESTFN)[](#l3.33)
with TempFile(filename):[](#l3.34)
with lzma.open(filename, "wb") as f:[](#l3.35)
f.write(INPUT)[](#l3.36)
with open(filename, "rb") as f:[](#l3.37)
file_data = lzma.decompress(f.read())[](#l3.38)
self.assertEqual(file_data, INPUT)[](#l3.39)
with lzma.open(filename, "rb") as f:[](#l3.40)
self.assertEqual(f.read(), INPUT)[](#l3.41)
+ def test_bad_params(self): # Test invalid parameter combinations. with self.assertRaises(ValueError):
--- a/Misc/NEWS +++ b/Misc/NEWS @@ -50,6 +50,8 @@ Core and Builtins Library ------- +- Issue #28229: lzma module now supports pathlib. +