Allow LZMAFile to accept modes with a "b" suffix.
This commit is contained in:
parent
33c34da574
commit
6cbb20cdf6
|
@ -40,9 +40,11 @@ Reading and writing compressed files
|
||||||
file will not be closed when the :class:`LZMAFile` is closed.
|
file will not be closed when the :class:`LZMAFile` is closed.
|
||||||
|
|
||||||
The *mode* argument can be either ``"r"`` for reading (default), ``"w"`` for
|
The *mode* argument can be either ``"r"`` for reading (default), ``"w"`` for
|
||||||
overwriting, or ``"a"`` for appending. If *filename* is an existing file
|
overwriting, or ``"a"`` for appending. These can equivalently be given as
|
||||||
object, a mode of ``"w"`` does not truncate the file, and is instead
|
``"rb"``, ``"wb"``, and ``"ab"`` respectively.
|
||||||
equivalent to ``"a"``.
|
|
||||||
|
If *filename* is a file object (rather than an actual file name), a mode of
|
||||||
|
``"w"`` does not truncate the file, and is instead equivalent to ``"a"``.
|
||||||
|
|
||||||
When opening a file for reading, the input file may be the concatenation of
|
When opening a file for reading, the input file may be the concatenation of
|
||||||
multiple separate compressed streams. These are transparently decoded as a
|
multiple separate compressed streams. These are transparently decoded as a
|
||||||
|
|
10
Lib/lzma.py
10
Lib/lzma.py
|
@ -54,7 +54,8 @@ class LZMAFile(io.BufferedIOBase):
|
||||||
be an existing file object to read from or write to.
|
be an existing file object to read from or write to.
|
||||||
|
|
||||||
mode can be "r" for reading (default), "w" for (over)writing, or
|
mode can be "r" for reading (default), "w" for (over)writing, or
|
||||||
"a" for appending.
|
"a" for appending. These can equivalently be given as "rb", "wb",
|
||||||
|
and "ab" respectively.
|
||||||
|
|
||||||
format specifies the container format to use for the file.
|
format specifies the container format to use for the file.
|
||||||
If mode is "r", this defaults to FORMAT_AUTO. Otherwise, the
|
If mode is "r", this defaults to FORMAT_AUTO. Otherwise, the
|
||||||
|
@ -93,7 +94,7 @@ class LZMAFile(io.BufferedIOBase):
|
||||||
self._pos = 0
|
self._pos = 0
|
||||||
self._size = -1
|
self._size = -1
|
||||||
|
|
||||||
if mode == "r":
|
if mode in ("r", "rb"):
|
||||||
if check != -1:
|
if check != -1:
|
||||||
raise ValueError("Cannot specify an integrity check "
|
raise ValueError("Cannot specify an integrity check "
|
||||||
"when opening a file for reading")
|
"when opening a file for reading")
|
||||||
|
@ -109,7 +110,7 @@ class LZMAFile(io.BufferedIOBase):
|
||||||
self._init_args = {"format":format, "filters":filters}
|
self._init_args = {"format":format, "filters":filters}
|
||||||
self._decompressor = LZMADecompressor(**self._init_args)
|
self._decompressor = LZMADecompressor(**self._init_args)
|
||||||
self._buffer = None
|
self._buffer = None
|
||||||
elif mode in ("w", "a"):
|
elif mode in ("w", "wb", "a", "ab"):
|
||||||
if format is None:
|
if format is None:
|
||||||
format = FORMAT_XZ
|
format = FORMAT_XZ
|
||||||
mode_code = _MODE_WRITE
|
mode_code = _MODE_WRITE
|
||||||
|
@ -119,7 +120,8 @@ class LZMAFile(io.BufferedIOBase):
|
||||||
raise ValueError("Invalid mode: {!r}".format(mode))
|
raise ValueError("Invalid mode: {!r}".format(mode))
|
||||||
|
|
||||||
if isinstance(filename, (str, bytes)):
|
if isinstance(filename, (str, bytes)):
|
||||||
mode += "b"
|
if "b" not in mode:
|
||||||
|
mode += "b"
|
||||||
self._fp = open(filename, mode)
|
self._fp = open(filename, mode)
|
||||||
self._closefp = True
|
self._closefp = True
|
||||||
self._mode = mode_code
|
self._mode = mode_code
|
||||||
|
|
|
@ -374,6 +374,21 @@ class FileTestCase(unittest.TestCase):
|
||||||
with LZMAFile(TESTFN, "a") as f:
|
with LZMAFile(TESTFN, "a") as f:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def test_init_mode(self):
|
||||||
|
with TempFile(TESTFN):
|
||||||
|
with LZMAFile(TESTFN, "r"):
|
||||||
|
pass
|
||||||
|
with LZMAFile(TESTFN, "rb"):
|
||||||
|
pass
|
||||||
|
with LZMAFile(TESTFN, "w"):
|
||||||
|
pass
|
||||||
|
with LZMAFile(TESTFN, "wb"):
|
||||||
|
pass
|
||||||
|
with LZMAFile(TESTFN, "a"):
|
||||||
|
pass
|
||||||
|
with LZMAFile(TESTFN, "ab"):
|
||||||
|
pass
|
||||||
|
|
||||||
def test_init_bad_mode(self):
|
def test_init_bad_mode(self):
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x"))
|
LZMAFile(BytesIO(COMPRESSED_XZ), (3, "x"))
|
||||||
|
@ -382,11 +397,11 @@ class FileTestCase(unittest.TestCase):
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
LZMAFile(BytesIO(COMPRESSED_XZ), "x")
|
LZMAFile(BytesIO(COMPRESSED_XZ), "x")
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
LZMAFile(BytesIO(COMPRESSED_XZ), "rb")
|
LZMAFile(BytesIO(COMPRESSED_XZ), "rt")
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
LZMAFile(BytesIO(COMPRESSED_XZ), "r+")
|
LZMAFile(BytesIO(COMPRESSED_XZ), "r+")
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
LZMAFile(BytesIO(COMPRESSED_XZ), "wb")
|
LZMAFile(BytesIO(COMPRESSED_XZ), "wt")
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
LZMAFile(BytesIO(COMPRESSED_XZ), "w+")
|
LZMAFile(BytesIO(COMPRESSED_XZ), "w+")
|
||||||
with self.assertRaises(ValueError):
|
with self.assertRaises(ValueError):
|
||||||
|
|
|
@ -15,6 +15,8 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- LZMAFile now accepts the modes "rb"/"wb"/"ab" as synonyms of "r"/"w"/"a".
|
||||||
|
|
||||||
- The bz2 module now contains an open() function, allowing compressed files to
|
- The bz2 module now contains an open() function, allowing compressed files to
|
||||||
conveniently be opened in text mode as well as binary mode.
|
conveniently be opened in text mode as well as binary mode.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue