subprocess调用第三方应用_datetime日期_time时间

文件夹compressed下有很多rarzip格式的压缩文件,如何用代码批量解压缩呢?自己不会写没关系,可以通过subprocess找外援。

这里找的外援Mac上是免费的解压缩appThe Unarchiverapp store下载);Windows上是免费开源的7-zip(搜索引擎找到官方网站下载)。

代码批解压的思路就是:遍历compressed文件夹下的所有压缩文件,启动第三方应用应用The Unarchiver7-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

MacWindows上的代码只有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上的设置和运行……敬请关注,谢谢