首页 > 编程语言 >[全网唯一]通过修改源码使得从ZIP提取文件并在提取时进行重命名保存(博客园同步发布)

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

时间:2023-10-25 21:34:02浏览次数:38  
标签:None 提取 ZIP targetpath targetname member 源码 path os

源码位置: /Lib/zipfile.py/ZipFile/_extract_member/zipfile.py或者直接点击extract函数.

在使用python解压缩zip文件时, 由于需要在解压时重命名文件为我想要的格式, 而不巧的是, zipfile包官方源代码没有这个功能...

于是, 在百度之后, 果断放弃寻找现成代码的想法.

在研究了一下extract函数的原源代码后, 觉得可以加一个参数targetname用来指代重命名后的文件名, 而很巧的是, 这个新参数并没有在源代码中使用, 所以加入它没有影响.

Talk is easy, show you code~

代码展示

row 1618
    def extract(self, member, path=None, pwd=None,targetname=None):
        """targetname : the name extracted rename to targetname
        
            Extract a member from the archive to the current working directory,
           using its full name. Its file information is extracted as accurately
           as possible. `member' may be a filename or a ZipInfo object. You can
           specify a different directory using `path'.
        """
        if path is None:
            path = os.getcwd()
        else:
            path = os.fspath(path)
 
        return self._extract_member(member, path, pwd,targetname)
 
    def extractall(self, path=None, members=None, pwd=None,targetname=None):
        """Extract all members from the archive to the current working
           directory. `path' specifies a different directory to extract to.
           `members' is optional and must be a subset of the list returned
           by namelist().
        """
        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_member(zipinfo, path, pwd,targetname)
row 1650
...
row 1665
def _extract_member(self, member, targetpath, pwd,targetname):
        """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)
 
        if os.path.altsep:
            arcname = arcname.replace(os.path.altsep, os.path.sep)
        # interpret absolute pathname as relative, remove drive letter or
        # UNC path, redundant separators, "." and ".." components.
        arcname = os.path.splitdrive(arcname)[1]
        invalid_path_parts = ('', os.path.curdir, os.path.pardir)
        arcname = os.path.sep.join(x for x in arcname.split(os.path.sep)
                                   if x not in invalid_path_parts)
        if os.path.sep == '\\':
            # filter illegal characters on Windows
            arcname = self._sanitize_windows_name(arcname, os.path.sep)
        if targetname is None:
            targetpath = os.path.join(targetpath, arcname)
            targetpath = os.path.normpath(targetpath)
        else:
            targetpath = os.path.normpath(targetpath)
 
        # Create all upper directories if necessary.
        upperdirs = os.path.dirname(targetpath)
        if upperdirs and not os.path.exists(upperdirs):
            os.makedirs(upperdirs)
 
        if member.is_dir():
            if not os.path.isdir(targetpath):
                os.mkdir(targetpath)
            return targetpath
        if targetname is None:
            with self.open(member, pwd=pwd) as source, \
                open(targetpath, "wb") as target:
                shutil.copyfileobj(source, target)
        else:
            with self.open(member, pwd=pwd) as source, \
                open(targetpath+"/"+targetname, "wb") as target:
                shutil.copyfileobj(source, target)
 
        return targetpath
row 1713

  用法

可以直接粘贴到自己的源码中, 如果担心出现其他bug, 可以用完就重装zipfile.

调用extract时传入三个参数: 压缩包名称, 目标目录, 目标名称(重命名后的名字, 如果为None则默认原命名)

标签:None,提取,ZIP,targetpath,targetname,member,源码,path,os
From: https://www.cnblogs.com/zenolab/p/17788173.html

相关文章

  • 基于Python的猫狗宠物展示系统-计算机毕业设计源码+LW文档
    摘 要 随着时代的发展,人们对宠物也越来越重视,近些年来我国的宠物产业也发生了翻天覆地的变化,但是很多人在出去宠物的时候不知道去哪里宠物,在预订酒店和机票的时候也没有一个综合性的宠物网站,为了让人们的宠物变的更加的方便,为此我开发了本基于Python的猫狗宠物展示系统本基于......
  • Nacos源码阅读心得
    Nacos注册中心(1.4.1)源码解读心得一丶Nacos介绍Nacos是阿里巴巴推出的一款新开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它致力于帮助您发现、配置和管理微服务,提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数......
  • Metasploit Linux Reverse_Tcp Shellcode 源码分析
    分析Metasploitlinux/x64/shell/reverse_tcpshellcodeShellcode生成使用msfvenom生成c格式的stagedshellcode$msfvenom-plinux/x64/shell/reverse_tcp-fc-ax64--platformlinuxLHOST=192.168.48.233LPORT=4444Payloadsize:130bytesFinalsizeofcf......
  • 03-6021蓝牙源码分析
    目录一.非定向广播1.voidapp_remote_normal_undir_adv(void)1.1.boolapp_remote_check_bond_state(void)一.非定向广播1.voidapp_remote_normal_undir_adv(void)voidapp_remote_normal_undir_adv(void){//printk("%s\r\n",__FUNCTION__);printk("......
  • 直播商城系统源码,快速滑动条/快速滑块/快速滚动条标准实现
    直播商城系统源码,快速滑动条/快速滑块/快速滚动条标准实现 /* *Copyright2018TheAndroidOpenSourceProject * *LicensedundertheApacheLicense,Version2.0(the"License"); *youmaynotusethisfileexceptincompliancewiththeLicense. *Youmay......
  • 直播app系统源码,bootstrap5 text左对齐右对齐
    直播app系统源码,bootstrap5text左对齐右对齐在bootstrap4中text左/右对齐   <h1class="text-right">右对齐</h1>  <h1class="text-left">左对齐</h1>  <h1class="text-center">居中</h1> ​看了下官网在bootstrap5中就不起作用了换成t......
  • Apple开发_字符串后缀如果包含有数字,提取出字符串后缀全部的数字
    NSString分类@implementationNSString(GC)-(NSString*)suffix_Num{//匹配字符串末尾的数字NSString*pattern=@"\\d+$";NSError*error=nil;NSRegularExpression*regex=[NSRegularExpressionregularExpressionWithPattern:patternoptions......
  • Jmeter之json提取器
    Jmeter之json提取器一、json提取器设置多个变量获取多个数据1、json的Path表达式:$.data.result[*].data.tradeTitle $表示根元素,然后一级级属性往下去找,先找到data,再往下子节点找到result,[*]表示该节点下有多个子节点。然后找到data,再找到tradeTitle2、添加:后置处理器——j......
  • springboot生成二维码的正确姿势-附视频附源码
    @目录前言初始化SpringBoot项目引入依赖编码编写工具类生成二维码资源共享二维码的原理是什么,如何保证不重复?你有没有想过这样一件事,二维码是实现原理是什么?如何保证各个平台的二维码是唯一的?就算你的程序停止运行,但是你的二维码依然存在。设计上要保证唯一性,比如在物流等环......
  • javaweb第11章源码
    javaweb第11章源码下载链接:https://wwpv.lanzoue.com/ifkAa1crixqd文件结构CHAPTER11│.classpath│.project│├─.settings│.jsdtscope│org.eclipse.jdt.core.prefs│org.eclipse.wst.common.component│org.eclipse.wst.common.proje......