文件夹compressed下有很多rar和zip格式的压缩文件,如何用代码批量解压缩呢?自己不会写没关系,可以通过subprocess找外援。
这里找的外援Mac上是免费的解压缩app:The Unarchiver(app store下载);Windows上是免费开源的7-zip(搜索引擎找到官方网站下载)。
代码批解压的思路就是:遍历compressed文件夹下的所有压缩文件,启动第三方应用应用The Unarchiver或7-zip批量解压缩压缩文件。
通过subprocess.run()启动第三方应用需要先获得第三方应用的位置:
Mac上打开Finder,边栏上选中Application,内容栏就会显示安装在本机上的应用。鼠标右键The Unarchiver(或要用的其他app)的图标,出现的菜单项里选第二项“Show Package Contents”-> “Contents” -> MacOS,这个文件夹下就可以看到类型(Kind)是可执行文件(Unix executable)的The Unarchiver的位置了。按住cmd+opt+c三键可以将其路径:
/Applications/The Unarchiver.app/Contents/MacOS/The Unarchiver
拷贝到剪贴板上,构建subprocess.run()的第一个参数。还有个办法是打开terminal终端窗口,把可执行文件The Unarchiver直接拉到terminal里,也可获得The Unarchiver的路径。
Windows上如果7-zip安装时没有改变安装路径,到c:\Program Files下去找7-Zip下的7z.exe。
Mac和Windows上的代码只有subprocess.run()调用第三方应用时有差别,示范代码以Mac上为例,Windows上只需修改跟路径相关的语句(2)和(4),在语句解释时会提及:
from pathlib import Path # 对文件和文件夹进行操作
import subprocess
def unrarFile(p): # 解压缩函数
print("***解压缩APP开始启动***\n")
# 成批解压缩压缩文件
for file in list(p.glob('**/*.rar')) + list(p.glob('**/*.zip')): (1)
try:
subprocess.run('/Applications/The\ Unarchiver.app/contents
/MacOS/The\ Unarchiver ' + str(file), shell=True) (2)
except Exception as err: (3)
print(err)
def main(): # 主函数其实就是个普通函数,可以带自己的参数,可以被调用
path = "/Users/PythonABC/Documents/compressed" (4)
s = Path(path) # 生成路径对象
unrarFile(s) # 调用解压函数
print('搞定!!!')
main() # 调用主函数
(1) glob('**/*.rar')获得p目录及其子目录下所有扩展名为rar的文件;list()将这些文件放进一个列表中。用+合并列表,获得p为树根的文件夹树上所有扩展名为rar和zip的压缩文件。
(2) run()带了两个参数,Mac上因为第一个参数用的是字符串,所以参数shell=True。字符串参数放在终端窗口启动The Unarchiver的命令行。第三方应用unarchiver可执行文件名:The Unarchiver,名字里里有空格,在terminal上直接用cmd+opt+c三键获得的路径(粘贴板里):/Applications/The Unarchiver.app/Contents/MacOS/The Unarchiver会出现错误提示:-bash: /Applications/The: No such file or directory,系统只认到空格之前。如果用鼠标直接把MacOS下的可执行文件The Unarchiver拉到Terminal窗口上,命令行变成:/Applications/The\ Unarchiver.app/Contents/MacOS/The\ Unarchiver,可见在路径内的空格前加转义字符‘\’可以解决问题。不加文件名这条命令启动The Unarchieve,加文件名启动The Unarchieve解压指定文件。代码里启动同样功能,用语句(2)的形式。
如果压缩文件夹对‘写’权限有限制,(2)前需要加一条:subprocess.run(['chmod', '0o777', path])放开写权限。
若是在Windows上,只需把语句(2)改成:
subprocess.run(‘”c:\\Program Files\\7-Zip\\7s.exe” x ‘ + str(file) + ‘ -aoa -o’ + str(p), shell=True)
因为在Windows命令窗口上用7z.exe解压缩.zip文件(example.zip)的命令是任意路径下,敲入命令:
“c:\Program Files\7-Zip\7z.exe” x c:\Users\PythonABC\Documents\compressed\example.zip -aoa
-oC:\Users\PythonABC\Documents\compressed
这条命令里的路径里有空格,所以命令行里调用7z.exe命令时,需要把路径和可执行文件本身放进双引号内。当然如果路径上没有空格就不需要这对双引号了;x参数是解压extract;c:\Users\PythonABC\Documents\compressed\example.zip是压缩文件的路径和文件名;-aoa参数是覆盖已经存在的同名文件;-o是指定解压好的文件存放位置,后面紧跟存放路径。参数通过查7z.exe的帮助文件获得。
(3)用try……except是为了一个压缩文件解压出错时程序不至于崩溃,而是会输出错误信息,而后继续解压下一个文件。
(4)这里放压缩文件的文件夹的绝对路径,Windows上改成:
path = "C:\\Users\\PythonABC\\Documents\\compressed"
MAC上在Finder上选中文件或文件夹后,按住cmd+opt+c三键可以将其路径拷贝到剪贴板上。Windows选中文件夹后点击右键, 选中属性(Properties),弹出的属性窗口,复制路径即可
即将推出的Python ABC教程对PythonABC视频内容进行了梳理,修正了发现的错误、对代码做了些许优化、替换掉视频中的英文注释、替换掉国内不能访问的资源、添加windows上的设置和运行……敬请关注,谢谢