翼度科技»论坛 编程开发 python 查看内容

[全网唯一]通过修改源码使得从ZIP提取文件并在提取时进行重命名保存(博客园

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
源码位置: /Lib/zipfile.py/ZipFile/_extract_member/zipfile.py或者直接点击extract函数.
在使用python解压缩zip文件时, 由于需要在解压时重命名文件为我想要的格式, 而不巧的是, zipfile包官方源代码没有这个功能...
于是, 在百度之后, 果断放弃寻找现成代码的想法.
在研究了一下extract函数的原源代码后, 觉得可以加一个参数targetname用来指代重命名后的文件名, 而很巧的是, 这个新参数并没有在源代码中使用, 所以加入它没有影响.
Talk is easy, show you code~
代码展示
  1. row 1618
  2.     def extract(self, member, path=None, pwd=None,targetname=None):
  3.         """targetname : the name extracted rename to targetname
  4.         
  5.             Extract a member from the archive to the current working directory,
  6.            using its full name. Its file information is extracted as accurately
  7.            as possible. `member' may be a filename or a ZipInfo object. You can
  8.            specify a different directory using `path'.
  9.         """
  10.         if path is None:
  11.             path = os.getcwd()
  12.         else:
  13.             path = os.fspath(path)
  14.         return self._extract_member(member, path, pwd,targetname)
  15.     def extractall(self, path=None, members=None, pwd=None,targetname=None):
  16.         """Extract all members from the archive to the current working
  17.            directory. `path' specifies a different directory to extract to.
  18.            `members' is optional and must be a subset of the list returned
  19.            by namelist().
  20.         """
  21.         if members is None:
  22.             members = self.namelist()
  23.         if path is None:
  24.             path = os.getcwd()
  25.         else:
  26.             path = os.fspath(path)
  27.         for zipinfo in members:
  28.             self._extract_member(zipinfo, path, pwd,targetname)
  29. row 1650
  30. ...
  31. row 1665
  32. def _extract_member(self, member, targetpath, pwd,targetname):
  33.         """Extract the ZipInfo object 'member' to a physical
  34.            file on the path targetpath.
  35.         """
  36.         if not isinstance(member, ZipInfo):
  37.             member = self.getinfo(member)
  38.         # build the destination pathname, replacing
  39.         # forward slashes to platform specific separators.
  40.         arcname = member.filename.replace('/', os.path.sep)
  41.         if os.path.altsep:
  42.             arcname = arcname.replace(os.path.altsep, os.path.sep)
  43.         # interpret absolute pathname as relative, remove drive letter or
  44.         # UNC path, redundant separators, "." and ".." components.
  45.         arcname = os.path.splitdrive(arcname)[1]
  46.         invalid_path_parts = ('', os.path.curdir, os.path.pardir)
  47.         arcname = os.path.sep.join(x for x in arcname.split(os.path.sep)
  48.                                    if x not in invalid_path_parts)
  49.         if os.path.sep == '\\':
  50.             # filter illegal characters on Windows
  51.             arcname = self._sanitize_windows_name(arcname, os.path.sep)
  52.         if targetname is None:
  53.             targetpath = os.path.join(targetpath, arcname)
  54.             targetpath = os.path.normpath(targetpath)
  55.         else:
  56.             targetpath = os.path.normpath(targetpath)
  57.         # Create all upper directories if necessary.
  58.         upperdirs = os.path.dirname(targetpath)
  59.         if upperdirs and not os.path.exists(upperdirs):
  60.             os.makedirs(upperdirs)
  61.         if member.is_dir():
  62.             if not os.path.isdir(targetpath):
  63.                 os.mkdir(targetpath)
  64.             return targetpath
  65.         if targetname is None:
  66.             with self.open(member, pwd=pwd) as source, \
  67.                 open(targetpath, "wb") as target:
  68.                 shutil.copyfileobj(source, target)
  69.         else:
  70.             with self.open(member, pwd=pwd) as source, \
  71.                 open(targetpath+"/"+targetname, "wb") as target:
  72.                 shutil.copyfileobj(source, target)
  73.         return targetpath
  74. row 1713
复制代码
  用法
可以直接粘贴到自己的源码中, 如果担心出现其他bug, 可以用完就重装zipfile.
调用extract时传入三个参数: 压缩包所在目录, 目标目录, 目标名称(重命名后的名字, 如果为None则默认原命名)

来源:https://www.cnblogs.com/zenolab/p/17788173.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
来自手机

举报 回复 使用道具