From c92fc8261dd89cfc1d11a5aee28ed28df4579346 Mon Sep 17 00:00:00 2001 From: Florent Xicluna Date: Sat, 27 Feb 2010 11:26:58 +0000 Subject: Merged revisions 78461,78482 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ........ r78461 | florent.xicluna | 2010-02-26 11:40:58 +0100 (ven, 26 fév 2010) | 2 lines #691291: codecs.open() should not convert end of lines on reading and writing. ........ r78482 | florent.xicluna | 2010-02-27 12:19:18 +0100 (sam, 27 fév 2010) | 2 lines Add entry for issue #691291. ........ --- Lib/codecs.py | 13 +++++++++---- Lib/test/test_codecs.py | 15 +++++++++++++++ Misc/NEWS | 3 +++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/Lib/codecs.py b/Lib/codecs.py index 557ccf7..a67240a 100644 --- a/Lib/codecs.py +++ b/Lib/codecs.py @@ -858,10 +858,15 @@ def open(filename, mode='rb', encoding=None, errors='strict', buffering=1): parameter. """ - if encoding is not None and \ - 'b' not in mode: - # Force opening of the file in binary mode - mode = mode + 'b' + if encoding is not None: + if 'U' in mode: + # No automatic conversion of '\n' is done on reading and writing + mode = mode.strip().replace('U', '') + if mode[:1] not in set('rwa'): + mode = 'r' + mode + if 'b' not in mode: + # Force opening of the file in binary mode + mode = mode + 'b' file = __builtin__.open(filename, mode, buffering) if encoding is None: return file diff --git a/Lib/test/test_codecs.py b/Lib/test/test_codecs.py index 57420ff..7c3a30b 100644 --- a/Lib/test/test_codecs.py +++ b/Lib/test/test_codecs.py @@ -437,6 +437,21 @@ class UTF16Test(ReadTest): def test_errors(self): self.assertRaises(UnicodeDecodeError, codecs.utf_16_decode, "\xff", "strict", True) + def test_bug691291(self): + # Files are always opened in binary mode, even if no binary mode was + # specified. This means that no automatic conversion of '\n' is done + # on reading and writing. + s1 = u'Hello\r\nworld\r\n' + + s = s1.encode(self.encoding) + try: + with open(test_support.TESTFN, 'wb') as fp: + fp.write(s) + with codecs.open(test_support.TESTFN, 'U', encoding=self.encoding) as reader: + self.assertEqual(reader.read(), s1) + finally: + test_support.unlink(test_support.TESTFN) + class UTF16LETest(ReadTest): encoding = "utf-16-le" diff --git a/Misc/NEWS b/Misc/NEWS index 33601a8..2018e7c 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -74,6 +74,9 @@ Core and Builtins Library ------- +- Issue #691291: codecs.open() should not convert end of lines on reading and + writing. + - Issue #7975: correct regression in dict methods supported by bsddb.dbshelve. - Issue #7959: ctypes callback functions are now registered correctly -- cgit v0.12