diff -r 0926adcc335c Lib/fileinput.py --- a/Lib/fileinput.py Mon Feb 24 15:36:45 2014 -0500 +++ b/Lib/fileinput.py Tue Feb 25 23:33:19 2014 +0200 @@ -387,9 +387,16 @@ def hook_encoded(encoding): - import codecs + import io def openhook(filename, mode): - return codecs.open(filename, mode, encoding) + if 'U' in mode: + newline = None + mode = mode.replace('U', '') + else: + newline = '\n' + mode = mode.replace('b', '') + return io.open(filename, mode or 'r', + encoding=encoding, newline=newline) return openhook diff -r 0926adcc335c Lib/test/test_fileinput.py --- a/Lib/test/test_fileinput.py Mon Feb 24 15:36:45 2014 -0500 +++ b/Lib/test/test_fileinput.py Tue Feb 25 23:33:19 2014 +0200 @@ -218,8 +218,27 @@ finally: remove_tempfiles(t1) +class Test_hook_encoded(unittest.TestCase): + """Unit tests for fileinput.hook_encoded()""" + + def test_modes(self): + # Unlikely UTF-7 is locale encoding + t1 = writeTmp(1, ["A\nB\r\nC\rD+IKw-"], mode="wb") + self.addCleanup(safe_unlink, t1) + + def check(mode, expected_lines): + fi = FileInput(files=t1, mode=mode, openhook=hook_encoded('utf-7')) + lines = list(fi) + fi.close() + self.assertEqual(lines, expected_lines) + + check('r', [u'A\n', u'B\r\n', u'C\rD\u20ac']) + check('rU', [u'A\n', u'B\n', u'C\n', u'D\u20ac']) + check('U', [u'A\n', u'B\n', u'C\n', u'D\u20ac']) + check('rb', [u'A\n', u'B\r\n', u'C\rD\u20ac']) + def test_main(): - run_unittest(BufferSizesTests, FileInputTests) + run_unittest(BufferSizesTests, FileInputTests, Test_hook_encoded) if __name__ == "__main__": test_main()