Allow LZMAFile to accept modes with a "b" suffix.

This commit is contained in:
Nadeem Vawda 2012-06-04 23:36:24 +02:00
parent 33c34da574
commit 6cbb20cdf6
4 changed files with 30 additions and 9 deletions

View File

@ -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

View File

@ -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

View File

@ -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):

View File

@ -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.