unpack(解压)
这个是用pyautogui实现的一个自动解压,因为压缩包里没有文件夹,需要新建一个和压缩包名字一样的文件夹,
逻辑
用7zip的图像识别,找到左上方的第一个图标,复制压缩包的名字,在空白处新建文件夹,名字就用刚才复制的,刚好文件夹就在压缩包的下面,继续找到7zip的图标,拖到新建的文件夹里,进入文件夹,解压,删除压缩包,返回上一层,重复操作
遇到的问题
‘新建文件夹’这个名字排序一开始是在前面的,后来就会排到后面,需要点一下右边的滑动条那个小箭头,最好是点一下,一开始点的次数多,到最后面就没办法自动化了,位置变了。
for j in range(1):
click(1357,697)
一些知识点
dragTo() 和 drag()
dragTO(point,duration,button) # 拖拽到指定位置,这里就是从当前鼠标在的位置拖拽,有三个参数,duration是拖拽时间
drag() # 相对当前鼠标位置,拖拽指定像素,
locateCenterOnScreen()
后面想起来可以直接定位图片的中心位置坐标,我当时用了个笨办法,先用box()返回图片的左上角坐标和长宽,然后算出来的中心点坐标
注意
文件夹里显示的方式必须是列表,刚好可以压缩包在新建文件夹的下面,拖拽的时候位置相对7zip.png的位置是固定的,这里的图像识别最好使用一个好识别的,像7zip只有黑白两种颜色,就很好识别
deleteheader(删除Word页眉页脚)
用os,win32com实现的批量给Word文档去页眉页脚的一个小工具
逻辑
用os.walk()遍历所有子文件夹,然后把子文件夹里的文件名取出来放在一个列表里,遍历列表里的文件名,然后截取文件名的拓展名,如果是doc,docx就调用removeHeaderFooter()函数,如果不是跳过。removeHeaderFooter()主要是用win32com实现
遇到的问题
win32com
有一些Word文件限制编辑,执行到会终止程序,暂时没什么好的解决办法,只能手动把文件弄出来再执行一次,但是这样就有很多重复执行了的,暂时想到的办法就是把大量的文件分成几个组分开去除页眉页脚。
主要还是win32com没搞明白,之后看一下,有时间优化一下,可以改成如果遇到限制编辑的文件就把这个文件放到一个专门的文件夹。
os.walk(path)
这里用的事遍历子文件夹实现的,这样就没办法给最上面的那个文件夹里的Word文档去除页眉页脚,虽然我用不上,但是如果需要的话可以用遍历文件的方式
path = 'C:\\Users\\马赛克\\Documents\\Python\\workspace\\PRA\\test'
for root,subFolders,fileNames in os.walk(path):
for fileName in fileNames:
if os.path.isfile(os.path.join(root, fileName)) and fileName.split('.')[-1].lower() in ['doc', 'docx']:
print("去除"+os.path.join(root,fileName)+"的页眉页脚")
一些知识点
os.walk(path)
os.walk()循环时返回三个值
-
当前文件夹路径的字符串
-
当前文件夹子文件夹名的字符串列表
-
当前文件夹中文件名的字符串列表
注意: 当前文件夹是指for循环当前迭代的文件夹,程序的当前工作目录不会因为os.walk()而改变
os.walk() 方法可以创建一个生成器,用以生成所要查找的目录及其子目录下的所有文件。
os.walk() 方法用于通过在目录树中游走输出在目录中的文件名,向上或者向下。
生成器可以理解为迭代器,迭代器是一个有记忆的东西,遍历过得东西他不会再。。。,就是说
os.listdir(path)
返回path目录下的所有文件名组成的列表
注意
dedup(删除原来的文件)
上面处理完的文件,经过Word转PDF,PDF去除密码,删除PDF页眉页脚后,新的PDF文件都是以Do_、Removed_作为文件名前缀,这里需要把原来的Word和PDF删除到。
逻辑
用os.walk()遍历所有文件,取出文件名切片判断有没有对应的前缀,如果没有就删除,如果有跳过
一些知识点
str.split()
切片后返回的是一个列表,如果没有切片的分隔符就直接返回整个str,这样就不能取列表的第[1]个(会越界),可以用最后一个[-1],python这个有倒序的真好用。
这里其实不用判断isfile(),因为前面循环的就是fileNames,这里直接复制的,当时没注意,现在发现了。
os.unlink()
os.unlink(path)
: 删除path处的文件。
os.rmdir(path)
: 删除path处的文件夹。该文件夹必须为空,其中没有任何文件和文件夹。
shutil.rmtree(path)
:删除 path 处的文件夹,它包含的所有文件和文件夹都会被删除。
注意:使用时,需要非常小心,避免删错文件,一般在第一次运行时,注释掉这些程序,并加上print()
函数来帮助查看是否是想要删除的文件。
send2trash模块安全删除
shutil.rmtree(path)
会不可恢复的删除文件和文件夹,用起来会有危险。因此使用第三方的send2trash
模块,可以将文件或文件夹发送到计算机的垃圾箱或回收站,而不是永久删除。因程序缺陷而用send2trash 删除的某些你不想删除的东西,稍后可以从垃圾箱恢复。
注意:使用时,需要非常小心,避免删错文件,一般在第一次运行时,注释掉这些程序,并加上print()
函数来帮助查看是否是想要删除的文件。
pip install send2trash #安装send2trash模块
import send2trash
send2trash.send2trash('bacon.txt')
注意
这里用到了删除文件的os.unlink(),一定要注意先看一下有没有删对,或者是先用测试数据测试,不要直接在没有备份的数据上试,删错了找不回来
rename(重命名,删前缀)
一个批量重命名的小工具,用os.walk()遍历所有文件,把文件名切片,然后加上要删除或者增加的前缀
一些知识点
os.rename(path1,path2)
有两个参数,第一个参数是重命名的文件的路径,重命名后新的文件名和路径
注意
第一次重命名成功后如果再次执行,已经没有原来的分隔符,就会在原文件名前面加新东西,多次执行后文件名会变得很长,记得再次执行时复原原来的文件名
pack(文件打包)
逻辑
先用os.walk()遍历所有子文件夹,创建跟子文件夹名字相同的zip压缩包,然后遍历子文件夹里的文件,把所有文件添加到压缩包中
遇到的问题
ZipFile.write(_filename_, _arcname=None_, _compress_type=None_, _compresslevel=None_)
第一个参数是将要添加到压缩包中的文件的名字,第二个参数是添加到压缩包后的名字,默认是把文件的路径也连带进去的,也就是说,如果不写第二个参数,最后压缩包中并不是打开就是文件,而是这个文件原来的上级文件,一层一层到这个文件
一些知识点
zipfile库
zipfile.ZipFile(path+filename+'zip',)
第二个参数可以是w
新添加进去的文件会覆盖原来的文件,如果是a
就不会。
.close()
如果不关闭
os.walk()
os.walk()遍历的文件一直是当前目录中的文件,也就是说子文件夹中的文件是添加不到压缩包里的,如果想用直接遍历当前文件夹中的文件添加到压缩包,压缩包命名的时候就需要变成root+'.zip'
,下面的代码是原来的代码,下面的下面是新的代码,原来的代码是不能把根目录里的文件压缩的,现在可以了
path = ''
for root, subFolders,fileNames in os.walk(path):
for subFolder in subFolders:
newZip = zipfile.ZipFile(root+'\\'+subFolder+'.zip', 'a')
print(os.path.join(root, subFolder))
for root1 ,subFolders1 ,fileNames1 in os.walk(os.path.join(root,subFolder,)):
for fileName1 in fileNames1:
newZip.close()
path2 = 'C:\\Users\\马赛克\\Documents\\Python\\workspace\\PRA\\test'
for root2 ,subFolders2 ,fileNames2 in os.walk(path2):
newZip2 = zipfile.ZipFile(root2+'.zip','a')
for fileName2 in fileNames2:
newZip2.write(os.path.join(root2,fileName2),fileName2)
newZip2.close()