不知道有没有小伙伴跟我一样犯这样的懒,一些简单重复的工作,总是嫌麻烦,懒得一步步去做,还每次都重复一样的操作。比如解压zip或rar的包,也许你会说,不就解压嘛,有啥的。问题来了,如果只是一个简单的压缩包也是算了,关键是压缩包里还有压缩包,也不知道多少层,要一层层去解压,这就比较恶心了吧?如下图:

学习了Python的递归调用后,心想,为什么我不写一个脚本自动解压所有的压缩包呢?emmm....心动不如行动,说写就写,谁让我是这么懒的一个人呢,连解压都得自动化,哈哈哈。

那就来吧,先从最简单的开始,搞个zip包用命令行解压看看:

#-*- coding: utf-8 -*-

importzipfileimportos

path= r'C:\Users\ES-IT-PC-193\Desktop\aa\A.zip'z= zipfile.ZipFile(path, 'r')

unzip_path= os.path.split(path)[0] #解压路径

z.extractall(path=unzip_path)

嗯,试了试,没问题,能正常解压。那接下来就是解决如果把压缩包里包含压缩包的也一块解压了,那我得把解压的命令封装成函数,然后循环解压就好了。这里正好用上了刚学不久的递归调用。

#-*- coding: utf-8 -*-#2019/8/13 14:57

importzipfileimportosdefunzip_file(path):'''解压zip包'''

ifos.path.exists(path):if path.endswith('.zip'):

z= zipfile.ZipFile(path, 'r')

unzip_path=os.path.split(path)[0]

z.extractall(path=unzip_path)

zip_list= z.namelist() #返回解压后的所有文件夹和文件

for zip_file inzip_list:

new_path=os.path.join(unzip_path,zip_file)

unzip_file(new_path)

z.close()elifos.path.isdir(path):for file_name inos.listdir(path):

unzip_file(os.path.join(path, file_name))else:print('the path is not exist!!!')if __name__ == '__main__':

zip_path= r'C:\Users\ES-IT-PC-193\Desktop\aa\A.zip'unzip_file(zip_path)

嗯,效果还不错,能把所有的压缩包都递归解压开了,然而,问题来了,解压开的文件名称怎么都成乱码了?!!

于是开始寻找解决乱码问题的方法,然后是各种百度。哎,编码问题一直困扰了我很久,总也搞不明白,这里推荐Alex写的一篇博客,写的很详细,反正我看完后就只知道,不管什么编码格式,都统统给它转成Unicode,然后再转成utf-8或者gbk的格式。哈哈哈。

Alex的博客链接:https://www.cnblogs.com/alex3714/articles/7550940.html

然后我就接着搞搞,各种尝试,还是不行,就是转换不过来,奇怪了。搞了好久还是没找到什么原因。彻底蒙圈了,郁闷~~,晚上睡觉我都能梦见我在解决编码问题,哈哈哈。今天早上脑袋还算比较清醒,再继续找bug。一行行代码调试。果然啊,功夫不负有心人。还是被我找到是什么原因了。

C:\Users\ES-IT-PC-193\Desktop\aa\A\│┬┤·└╓\

C:\Users\ES-IT-PC-193\Desktop\aa\A\╤Θ╓ñ┬δ.py

像这样的一个路径,打印出来的类型就是一个普通的,整行路径去转换格式是不行的!!只有把乱码的部分切割出来,再单独转换就可以了。哦,天。就这样,一个小小的问题,卡了我好久。泪奔~

再加上编码转换:

#-*- coding: utf-8 -*-#2019/8/13 14:57

importzipfileimportosdefunzip_file(path):'''解压zip包'''

ifos.path.exists(path):if path.endswith('.zip'):

z= zipfile.ZipFile(path, 'r')

unzip_path=os.path.split(path)[0]

z.extractall(path=unzip_path)

zip_list= z.namelist() #返回解压后的所有文件夹和文件for zip_file inzip_list:try:

zip_file2= zip_file.encode('cp437').decode('gbk')except:

zip_file2= zip_file.encode('utf-8').decode('utf-8')old_path=os.path.join(unzip_path,zip_file)

new_path=os.path.join(unzip_path,zip_file2)ifos.path.exists(old_path):

os.renames(old_path, new_path)

unzip_file(new_path)

z.close()elifos.path.isdir(path):for file_name inos.listdir(path):

unzip_file(os.path.join(path, file_name))else:print('the path is not exist!!!')if __name__ == '__main__':

zip_path= r'C:\Users\ES-IT-PC-193\Desktop\aa\A.zip'unzip_file(zip_path)

作为有强迫症患者的我,看着这个代码真是乱啊,不爽,需要优化一下。

于是做了一下几点优化:

1、加上rar压缩包的解压,这里需要注意的是,需要下载一个UnRAR.exe文件放在脚本的同级目录。

2、把编码转换再单独写一个函数,传入一个带有乱码的路径,返回转换好的路径就行了。

3、把解压单独写一个函数,这样解压zip和rar的包就不用写段重复的代码了。

4、解压后,目录里有一堆压缩包,我只想要解压后的文件,于是再写了一个删除解压后不用的压缩包的函数。

最终版的代码如下,欢迎各位小伙伴指导。

#-*- coding: utf-8 -*-#2019/8/13 14:57

importzipfileimportrarfileimportosimportsysdefchengeChar(path):'''处理乱码'''

if not os.path.exists(path): returnpath

path= path.rstrip('/').rstrip('\\') #去除路径最右边的/

file_name = os.path.split(path)[-1] #获取最后一段字符,准备转换

file_path = os.path.split(path)[0] #获取前面的路径,为rename做准备

try: #将最后一段有乱码的字符串转换,尝试过整个路径转换,不生效,估计是无法获取整个路径的编码格式吧。

new_name = file_name.encode('cp437').decode('gbk')except: #先转换成Unicode再转换回gbk或utf-8

new_name = file_name.encode('utf-8').decode('utf-8')

path2= os.path.join(file_path, new_name) #将转换完成的字符串组合成新的路径

try:

os.renames(path, path2)#重命名文件

except:print('renames error!!')returnpath2defdel_zip(path):'''删除解压出来的zip包'''path=chengeChar(path)if path.endswith('.zip') or path.endswith('.rar'):

os.remove(path)elifos.path.isdir(path):for i inos.listdir(path):

file_path=os.path.join(path, i)

del_zip(file_path)#递归调用,先把所有的文件删除

defunzip_file(z, unzip_path):'''解压zip包'''z.extractall(path=unzip_path)

zip_list= z.namelist() #返回解压后的所有文件夹和文件list

z.close()for zip_file inzip_list:

path=os.path.join(unzip_path, zip_file)ifos.path.exists(path): main(path)defmain(path):'''主逻辑函数'''path=chengeChar(path)ifos.path.exists(path):

unzip_path= os.path.splitext(path)[0] #解压至当前目录

if path.endswith('.zip') andzipfile.is_zipfile(path):

z= zipfile.ZipFile(path, 'r')

unzip_file(z, unzip_path)elif path.endswith('.rar'):

r=rarfile.RarFile(path)

unzip_file(r, unzip_path)elifos.path.isdir(path):for file_name inos.listdir(path):

path=os.path.join(path, file_name)ifos.path.exists(path): main(path)else:print(path)else:print('the path is not exist!!!')print(path)if __name__ == '__main__':#zip_path = r'C:\Users\ES-IT-PC-193\Desktop\aa\HighLevel\HighLevel'

zip_path = r'C:\Users\ES-IT-PC-193\Desktop\aa\HighLevel.zip'

#zip_path = sys.argv[1] # 接收传入的路径参数

ifos.path.isdir(zip_path):for file_name inos.listdir(zip_path):

path=os.path.join(zip_path, file_name)

main(path)else:

main(zip_path)if zipfile.is_zipfile(zip_path): #删除解压出来的压缩包

del_zip(os.path.splitext(zip_path)[0]) #以后缀名切割

python递归解压文件_递归调用解压zip包或rar包相关推荐

  1. python解压文件_使用Python实现文件压缩和解压

    大家可能都熟悉.zip格式的文件.它可以把多个文件,压缩成一个文件.这在网络上传输时很有用,而且节省硬盘空间. 接下来,我们使用Python实现压缩和解压. 读取ZIP文件信息 要读取ZIP文件的内容 ...

  2. python 解压文件 已存在_python解压zip和rar文件问题以及解决方法

    写此文的目的是记录自己的学习过程,一些经过,遇到问题以及解决问题的方法,存放在这里,方便自己以后复习以及自己的一些总结,如果此文对你有帮助,请随时联系我微信:wangzhixiong1533 ◆ ◆ ...

  3. python zipfile压缩的文件用shell命令解压_Python学习第177课——bzip2、zip方式压缩文件和解压文件...

    之前我们学习了tar打包.解包.gzip压缩,现在我们学习gzip解压. ●gzip解压 现在我们把上节生成的压缩文件linux_compressed.gz进行解压,使用命令: tar -xzf li ...

  4. bat递归查找指定文件_教你在电脑上用批处理脚本全盘查找文件

    0x00- 效果预览: 0x01 - 前言: 说起文件查找大家肯定都会,那么你试过用批处理脚本来查找一个文件在哪里吗? 今天就让我们来写一个能够全盘查找文件的批处理脚本吧! 0x02 - 准备: 设备 ...

  5. java递归api_javaAPI_IO流基础_递归使用

    IO流_递归 1.递归概述 递归指的是方法定义中调用自身方法的情况. 2.递归的注意事项 (1).要有出口,否则就是死递归 (2).次数不能太多,否则就内存溢出 (3).构造方法不能递归使用[不然在创 ...

  6. linux系统如何解gz文件,Linux 系统 压缩和解压 gz 格式文件

    Linux 系统 压缩和解压 gz 格式文件 引言 前面我们说了在 Linux 系统上比较常用的打包压缩解压  tar   及 zip 文件 的命令,那 Linux 上还有什么使用比较广泛的压缩解压文 ...

  7. python用什么处理文件_利用Python如何快速处理文件

    利用Python如何快速处理文件 我之前要合并将近1000个CSV表格 每个表格共370列,约360行不等,列名相同 三个方案瞬间浮现在我眼前: 1.Ctrl C + Ctrl V--可以睡公司了: ...

  8. python什么是入口文件_小问题大隐患:如何正确设置 Python 项目的入口文件?

    有一位同学提到了 Python 找不到模块的问题: 问题涉及到的代码结构和代码截图如下: 这个问题的解决方法非常简单,就是把start.py文件从bin文件夹移出来就好了. 但如果对这个问题进一步分析 ...

  9. python读取raw数据文件_【Python】OGR库(1):读取矢量数据

    OGR库是一个非常流行的处理地理空间矢量数据的开源库.它可以读取丰富的数据格式,允许用户进行几何处理.属性表操作.数据分析,是个非常强大的开源GIS库.目前OGR已集成在GDAL库中,可以说是GIS的 ...

最新文章

  1. .net core在vs开发环境下脱离iis运行
  2. ng-model 绑定checkbox 取不到值?
  3. IS-IS 的 DIS (伪节点) 及 DIS 和 OSPF中DR 的区别
  4. strlen 与 sizeof
  5. Android中的一些基础知识(二)
  6. 单边指数信号的特点_今日股市分析:上证指数若能守住3400,蓄力反弹就有戏...
  7. Python 在数据科学中一直打压 R 语言?
  8. [置顶] “非主流”Web容器之TomJetty之让服务动起来
  9. 如何能够做好主动沟通
  10. matlab 外接圆,【外接圆matlab知道三个顶点的坐标,如何求这三个顶点组成的三角形外接圆的半径与圆心坐标?】作业帮...
  11. body与html 会有间隙,css – thead和tbody之间的间距
  12. HTML嵌入三维仿真 .ezo文件的方法
  13. 面试专题:QTrade(苹果树)面试复盘
  14. 一篇搞懂OOA/OOD/OOP的区别
  15. 微信公众号更新缓存问题--批量添加版本号
  16. SpringBoot(39) 整合ELK
  17. 通过强化学习和官方API制作《星露谷物语》的自动钓鱼mod
  18. studio 报错Error: Activity class
  19. 区块链实验五 : 挖矿交易2
  20. python爬取js加载的数据_Python爬虫:爬取JS加载数据的网页

热门文章

  1. matlab算法实现对等额本息和等额本金两种还款方式的计算
  2. 数据库同步利器 otter 双A同步配置
  3. 项目js文件修改后浏览器不能及时更新的解决办法
  4. apache zip java_java中ant包中的org.apache.tools.zip实现压缩和解压缩
  5. UVM:一个简易验证平台例子
  6. 力扣(226.112)补9.8
  7. MYSQL5.7(64位)安装包及安装步骤
  8. tensorflow安装 报错ConnectionResetError(10054, ‘远程主机强迫关闭了一个现有的连接。
  9. 一文带你学明白java虚拟机:C1编译器,HIR代码优化
  10. 绝对值用计算机怎么打,绝对值符号怎么打