From 1d002b3218970d5a14192def5485a2d0b3f9f60d Mon Sep 17 00:00:00 2001 From: Gary Burton Date: Sun, 20 Jan 2013 17:16:01 +0000 Subject: [PATCH] Bug #6255. Wrap gzip files with TextIOWrapper to allow them to be read as text. svn: r21177 --- gramps/plugins/importer/importxml.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/gramps/plugins/importer/importxml.py b/gramps/plugins/importer/importxml.py index 71f6dc14b..3860485c6 100644 --- a/gramps/plugins/importer/importxml.py +++ b/gramps/plugins/importer/importxml.py @@ -375,7 +375,16 @@ class LineParser(object): try: if use_gzip: - ofile = gzip.open(filename, "rb") + import io + # Bug 6255. TextIOWrapper is required for python3 to present + # file contents as text, otherwise they are read + # as binary. However due to a missing method (read1) + # in early python3 versions this try block will fail + # It should work correctly from version 3.3 + # Gramps will still import XML files using python + # versions < 3.3.0 but the file progress meter will + # not work properly, going immediately to 100%. + ofile = io.TextIOWrapper(gzip.open(filename, "rb")) else: ofile = open(filename, "r") @@ -383,11 +392,12 @@ class LineParser(object): self.count += 1 if PERSON_RE.match(line): self.person_count += 1 - - ofile.close() except: self.count = 0 self.person_count = 0 + finally: + # Ensure the file handle is always closed + ofile.close() def get_count(self): return self.count