diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 05c31438d7f..87ee1948f27 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -475,9 +475,11 @@ class ZipExtFile(io.BufferedIOBase): # Search for universal newlines or line chunks. PATTERN = re.compile(r'^(?P[^\r\n]+)|(?P\n|\r\n?)') - def __init__(self, fileobj, mode, zipinfo, decrypter=None): + def __init__(self, fileobj, mode, zipinfo, decrypter=None, + close_fileobj=False): self._fileobj = fileobj self._decrypter = decrypter + self._close_fileobj = close_fileobj self._compress_type = zipinfo.compress_type self._compress_size = zipinfo.compress_size @@ -649,6 +651,12 @@ class ZipExtFile(io.BufferedIOBase): self._offset += len(data) return data + def close(self): + try : + if self._close_fileobj: + self._fileobj.close() + finally: + super(ZipExtFile, self).close() class ZipFile(object): @@ -896,8 +904,10 @@ class ZipFile(object): # given a file object in the constructor if self._filePassed: zef_file = self.fp + should_close = False else: zef_file = open(self.filename, 'rb') + should_close = True # Make sure we have an info object if isinstance(name, ZipInfo): @@ -951,7 +961,8 @@ class ZipFile(object): if ord(h[11]) != check_byte: raise RuntimeError("Bad password for file", name) - return ZipExtFile(zef_file, mode, zinfo, zd) + return ZipExtFile(zef_file, mode, zinfo, zd, + close_fileobj=should_close) def extract(self, member, path=None, pwd=None): """Extract a member from the archive to the current working directory,