作者:陈曦来源:早起Python大家好,又到了PythonOA系列。今天分享一个系统级的自动化案例:《给定一个文件夹,用Python检查给定的文件夹中是否有重复文件,如果有重复则删除》。涉及的主要知识点有:os模块综合应用glob模块综合应用使用filecmp模块比较两个文件,分析程序逻辑可以具体体现为:遍历得到给定文件夹下的所有文件,然后进行比较通过嵌套循环将两个文件看是否相同,如果相同则删除后者。实现问题的关键就变成了?如何判断两个文件是否相同?这里可以使用filecmp模块,看一下官方介绍文档:filecmp.cmp(f1,f2,shallow=True)比较名为f1和f2的文件,如果相等则返回True,否则返回False如果为真,则具有相同os.stat()签名的文件将被视为相等。否则,比较文件的内容。那么可以这么用吗?假设x和y这两个文件相同print(filecmp.cmp(x,y))True解决了这个问题,我们就可以开始写代码了!Python实现导入所需库并设置目标文件夹路径importosimportglobimportfilecmpdir_path=r'C:\\xxxx'然后遍历得到所有文件的绝对路径。我们可以使用glob模块的通配符结合递归参数来完成。框架如下:forfileinglob.glob(path+'/**/*',recursive=True):通过遍历得到每个文件或文件夹后,需要判断是否为文件。如果是文件,绝对路径可能存放在列表中,这里还需要做两件事:首先创建一个空列表,然后使用list.append(i)添加文件路径,然后使用os.path.isfile(i)判断是否为文件,返回True执行添加元素操作具体代码如下file_lst=[]foriinglob.glob(dir_path+'/**/*',recursive=True):ifos.path.isfile(i):file_lst.append(i)上一步我们获取到目标文件夹下的所有文件路径后,就可以嵌套遍历路径列表了,其中filecmp.cmp执行文件判断,os.remove执行文件删除forxinfile_lst:foryinfile_lst:ifx!=y:iffilecmp.cmp(x,y):os.remove(y)这里的代码已经实现了通用逻辑,但是有一个细节需要考虑:有可能循环到前面判断已经删除的文件,导致os.remove(file)报错,因为文件不存在。因此,可以使用os.path.exists来判断文件是否存在,如下:forxinfile_lst:foryinfile_lst:ifx!=yandos.path。exists(x)和os.path.exists(y):如果filecmp.cmp(x,y):os.remove(y)这样一个简单的文件去重小程序就完成了,完整代码如下:importosimportglobimportfilecmpdir_path=r'C:\xxxx'file_lst=[]fori在glob.glob(dir_path+'/**/*',recursive=True):ifos.path.isfile(i):file_lst.append(i)forxinfile_lst:foryinfile_lst:ifx!=yandos.path.exists(x)andos.path.exists(y):iffilecmp.cmp(x,y):os.remove(y)通过本文Python自动化脚本制作过程,我们可以体验Python办公再次自动化的力量
