不知道有没有小伙伴跟我一样犯这样的懒,一些简单重复的工作,总是嫌麻烦,懒得一步步去做,还每次都重复一样的操作。比如解压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递归解压文件_Python之路10-递归调用解压zip包或rar包相关推荐

  1. python批量解压文件_python 批量解压压缩文件的实例代码

    下面给大家介绍python 批量解压压缩文件的实例代码,代码如下所述: #/usr/bin/python#coding=utf-8import os,sys import zipfile open_p ...

  2. python中importlib模块安装_Python中标准模块importlib详解

    Python中标准模块importlib详解 模块简介 Python提供了importlib包作为标准库的一部分.目的就是提供Python中import语句的实现(以及__import__函数).另外 ...

  3. python如何实现下载文件_python实现下载文件的三种方法

    python实现下载文件的三种方法 Python开发中时长遇到要下载文件的情况,最常用的方法就是通过Http利用urllib或者urllib2模块. 当然你也可以利用ftplib从ftp站点下载文件. ...

  4. python怎么发送代码文件_python 通过 socket 发送文件的实例代码

    目录结构: client: #!/usr/bin/env python # -*-coding:utf-8 -*- import socket, struct, json download_dir = ...

  5. python扫描目录下文件_Python扫描目录读取文件,不考虑子目录

    这篇文章主要为大家详细介绍了Python扫描目录读取文件,不考虑子目录,具有一定的参考价值,可以用来参考一下. 感兴趣Python扫描目录读取文件,不考虑子目录的小伙伴,下面一起跟随512笔记的小编罗 ...

  6. python读取所有txt文件_python如何批量读取txt文件

    python批量读取txt文件的方法:首先导入系统模块:然后将文件夹路径更改为需要批量读取的txt文件存放的路径:再调用系统模块得到该文件夹下的所有文件名称:最后遍历文件夹,读取txt文件. 如果文件 ...

  7. python下的所有文件_python批量复制文件夹下所有文件大小

    python复制文件夹下所有文件 Python---进阶---文件操作---获取文件夹下所有文件的数量和大小 一.####编写一个程序,统计当前目录下每个文件类型的文件数 ####思路: - 打开当前 ...

  8. python多线程写同一个文件_Python多线程快速写入文件,python,飞速

    Python多线程快速写入文件,python,飞速 发表时间:2020-07-10 乱序多线程写入 举个最简单的例子,只要求快速写入即可,对顺序无要求时: import threading def w ...

  9. python写日志到文件_Python日志文件没有正确地写入日志消息,只有格式

    我一夜之间运行了一个Python脚本,发现日志文件只是我指定的消息格式的重复行,而不是实际的消息.在 main 模块中,我创建了如下记录器: from datetime import datetime ...

最新文章

  1. 双精度张量内核加快了高性能计算
  2. R算数运算符:+、-、*、/、%%、%/%、^
  3. Enterprise Library 3.0 安装过程
  4. java二进制转十进制代码_二进制转十进制java代码
  5. 央行“意外“降息 专家称贷款买房者首先受益
  6. BufferedReader_字符缓冲输入流
  7. OnLineML一:关于Jubatus 的简介...
  8. Java当中用 javabean和其他容器存入表格数据 或 利用 容器进行存储表格
  9. Java-修改class文件
  10. Android性能专项测试之Systrace工具
  11. MATLAB热障涂层成像,微波检测热障涂层孔隙率的可行性研究
  12. MaxScript脚本
  13. Dynamic Head Unifying Object Detection Heads with Attentions 论文阅读笔记
  14. 【第七章】 C语言之牛客网力扣刷题笔记 【点进来保证让知识充实你一整天】
  15. 在线制作banner的网站
  16. 5V 3A手机充电器方案
  17. 2020高考倒计时html,最新2020高考倒计时祝福语
  18. mor命令_MOR游戏的情况。
  19. 结构 Structure
  20. 信用评分卡模型总结9:评分卡生成及sas实施

热门文章

  1. vue使用阿里云视频点播
  2. Windows下Qt+minGW+CMake+opencv配置--方法总结、文件分享与排错分享
  3. 使用YQL解决跨域请求json转jsonp问题
  4. Android开源框架PowerfulViewLibrary——PowerfulEditText的介绍和源码解析
  5. 传奇微端大带宽服务器如何选择
  6. python使用pandas模块介绍以及使用,dataframe结构,Series结构,基本数据操作,DataFrame运算,pandas画图,存储,缺失值处理,离散化,合并
  7. python数据分析实战之超市零售分析
  8. 2005 最新GIS地理信息系统软件
  9. TRECVID2005 Overview
  10. Stata | 简单操作2(display)