diff --git a/Lib/configparser.py b/Lib/configparser.py index 7f1514f9020..03d6713097c 100644 --- a/Lib/configparser.py +++ b/Lib/configparser.py @@ -493,11 +493,10 @@ def read(self, filenames, encoding=None): read_ok = [] for filename in filenames: try: - fp = open(filename, encoding=encoding) + with open(filename, encoding=encoding) as fp: + self._read(fp, filename) except IOError: continue - self._read(fp, filename) - fp.close() read_ok.append(filename) return read_ok @@ -511,7 +510,7 @@ def read_file(self, f, source=None): """ if source is None: try: - srouce = f.name + source = f.name except AttributeError: source = '' self._read(f, source) diff --git a/Lib/test/test_cfgparser.py b/Lib/test/test_cfgparser.py index 3079cfb80ce..ad9b62a2bc6 100644 --- a/Lib/test/test_cfgparser.py +++ b/Lib/test/test_cfgparser.py @@ -328,9 +328,24 @@ def test_parse_errors(self): e = self.parse_error(cf, configparser.ParsingError, "[Foo]\n wrong-indent\n") self.assertEqual(e.args, ('',)) + # read_file on a real file + tricky = support.findfile("cfgparser.3") + if self.delimiters[0] == '=': + error = configparser.ParsingError + expected = (tricky,) + else: + error = configparser.MissingSectionHeaderError + expected = (tricky, 1, + ' # INI with as many tricky parts as possible\n') + with open(tricky) as f: + e = self.parse_error(cf, error, f) + self.assertEqual(e.args, expected) def parse_error(self, cf, exc, src): - sio = io.StringIO(src) + if hasattr(src, 'readline'): + sio = src + else: + sio = io.StringIO(src) with self.assertRaises(exc) as cm: cf.read_file(sio) return cm.exception