diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-03-08 13:45:43 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-08 13:45:43 (GMT) |
commit | eb65edd1029876a4a5bb70b009aeb914088ac749 (patch) | |
tree | acc215ff9664d32cf84b4c262aca6b2754e856f0 /Lib/zipfile.py | |
parent | 666165fddf499e80d10a5d9263846ec4534f6a2a (diff) | |
download | cpython-eb65edd1029876a4a5bb70b009aeb914088ac749.zip cpython-eb65edd1029876a4a5bb70b009aeb914088ac749.tar.gz cpython-eb65edd1029876a4a5bb70b009aeb914088ac749.tar.bz2 |
[3.6] bpo-28231: The zipfile module now accepts path-like objects for external paths. (#561)
(cherry picked from commit 8606e9524a7a4065042f7f228dc57eb74f88e4d3)
Diffstat (limited to 'Lib/zipfile.py')
-rw-r--r-- | Lib/zipfile.py | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/Lib/zipfile.py b/Lib/zipfile.py index 7f2b43c..d7f5beb 100644 --- a/Lib/zipfile.py +++ b/Lib/zipfile.py @@ -479,6 +479,8 @@ class ZipInfo (object): this will be the same as filename, but without a drive letter and with leading path separators removed). """ + if isinstance(filename, os.PathLike): + filename = os.fspath(filename) st = os.stat(filename) isdir = stat.S_ISDIR(st.st_mode) mtime = time.localtime(st.st_mtime) @@ -1070,6 +1072,8 @@ class ZipFile: self._comment = b'' # Check if we were passed a file-like object + if isinstance(file, os.PathLike): + file = os.fspath(file) if isinstance(file, str): # No, it's a filename self._filePassed = 0 @@ -1470,11 +1474,10 @@ class ZipFile: as possible. `member' may be a filename or a ZipInfo object. You can specify a different directory using `path'. """ - if not isinstance(member, ZipInfo): - member = self.getinfo(member) - if path is None: path = os.getcwd() + else: + path = os.fspath(path) return self._extract_member(member, path, pwd) @@ -1487,8 +1490,13 @@ class ZipFile: if members is None: members = self.namelist() + if path is None: + path = os.getcwd() + else: + path = os.fspath(path) + for zipinfo in members: - self.extract(zipinfo, path, pwd) + self._extract_member(zipinfo, path, pwd) @classmethod def _sanitize_windows_name(cls, arcname, pathsep): @@ -1509,6 +1517,9 @@ class ZipFile: """Extract the ZipInfo object 'member' to a physical file on the path targetpath. """ + if not isinstance(member, ZipInfo): + member = self.getinfo(member) + # build the destination pathname, replacing # forward slashes to platform specific separators. arcname = member.filename.replace('/', os.path.sep) @@ -1801,6 +1812,7 @@ class PyZipFile(ZipFile): If filterfunc(pathname) is given, it is called with every argument. When it is False, the file or directory is skipped. """ + pathname = os.fspath(pathname) if filterfunc and not filterfunc(pathname): if self.debug: label = 'path' if os.path.isdir(pathname) else 'file' |