源码 DelSomeFile.py
"""
此代码用于删除文件夹下面以txt结尾的文件
(同理将.txt-->.py可以删除py文件)
借用pyqt5调用文件选择对话框看起来比较人性化点
本来是用win32ui的,但是win32ui不太人性化,不能选择文件夹,
需要经过一点处理,虽也能实现,但是比较麻烦,而tk我也不熟悉
一下子去用也崩溃了,后来想起我玩过qt,索性就试试dlg = win32ui.CreateFileDialog(1) #打开文件对话框dlg.SetOFNInitialDir("E:") #初始dlg.DoModal()filename = dlg.GetPathName()print(os.path.dirname(filename),os.path.basename(filename))try:print(os.path.dirname(filename),"文件夹大小为:" ,scanFolder(os.path.dirname(filename)),"字节")except Exception as e:print("未选择路径")
"""from __future__ import print_function
import ctypes
import os,sys
from PyQt5.QtWidgets import QApplication,QFileDialogdef is_admin():try:return ctypes.windll.shell32.IsUserAnAdmin()except:return Falsedef scanFile(path):print(path,'文件夹:n')for filename in os.listdir(path):# print(os.access(filename, os.X_OK))if filename.endswith('.txt'):print('找到txt文件',filename,'是否删除?(Y or N)')active = input()if active.lower() == 'y':print(active.lower(),active)os.unlink(os.path.join(path,filename))print(filename,"已删除")else:print("未删除")#判断当前目录的子文件是否是目录,如果是,利用递归,到这个文件下if os.path.isdir(os.path.join(path,filename)):scanFile(os.path.join(path,filename))if __name__ == "__main__":if is_admin():# 调用qt5的文件夹窗口app = QApplication(sys.argv)filewindow = QFileDialog()filename = filewindow.getExistingDirectory()path = filenametry:scanFile(path)print('选择文件夹查询结束!!')input("按下任意键结束程序!!!")except Exception as e:print(e, "未选择路径")else:if sys.version_info[0] == 3:ctypes.windll.shell32.ShellExecuteW(None, 'runas', sys.executable, __file__, None, 1)# else:#else是在python2.x中使用的# ctypes.windll.shell32.ShellExectueW(None,u'runas',unicode(sys.executable,unicode(__file__),None,1))
1.1 运行后弹出文件管理对话框,人性化选择文件夹路径,(可以用qt、tk)
import os,sys
from PyQt5.QtWidgets import QApplication,QFileDialog
# 调用qt5的文件夹窗口
app = QApplication(sys.argv)
filewindow = QFileDialog()
filename = filewindow.getExistingDirectory()
path = filename #此处得到你选择的文件夹路径
#print(path)
1.2 本来是用win32ui的,但是win32ui似乎不支持选择文件夹,只是支持选择文件,得到文件路径,但是通过文件路径处理也能得到文件夹路径,即使能得到文件夹路径,感觉也比较没意思
import win32ui,os
dlg = win32ui.CreateFileDialog(1) #打开文件对话框dlg.SetOFNInitialDir("E:") #初始dlg.DoModal()filename = dlg.GetPathName()#此处得到文件路径print(os.path.dirname(filename),os.path.basename(filename))#通过os对文件路径进行处理前面得到文件夹路径--dirname#后面获得文件名称--basename
2.对文件夹进行递归处理,即判断此文件夹下是否还存在文件夹,反复递归,最终遍历整个文件夹
import os,sys
def scanFile(path):print(path,'文件夹:n')#打印当前处于哪个文件夹下面--绝对路径for filename in os.listdir(path):if filename.endswith('.txt'):#判断文件名后缀是否为txt,同理可以判断后缀是否是pyprint('找到txt文件',filename,'是否删除?(Y or N)')#交互选择--如果想全部删除,可以不要交互active = input()if active.lower() == 'y':print(active.lower(),active)os.unlink(os.path.join(path,filename))#将文件名加上路径,然后删除,如果只是想打印不删除,将这句话删掉就可以print(filename,"已删除")else:print("未删除")#如果没有输入Y就不会删除文件#判断当前目录的子文件是否是目录,如果是,利用递归,到这个文件下if os.path.isdir(os.path.join(path,filename)):scanFile(os.path.join(path,filename))#自己调用自己
3 由于部分文件夹或者说路径需要权限,于是加入调用权限功能---参考别人的代码,不能在ide中运行,要在cmd中:python DelSomeFile.py这样运行整个py文件
from __future__ import print_function
import ctypes
import os,sys
from PyQt5.QtWidgets import QApplication,QFileDialog
#我的逻辑还是弄不太清楚,此代码如果在ide中运行,则会直接结束,不能处理
def is_admin():try:return ctypes.windll.shell32.IsUserAnAdmin()except:return False
if is_admin():# 调用qt5的文件夹窗口app = QApplication(sys.argv)filewindow = QFileDialog()filename = filewindow.getExistingDirectory()path = filenametry:scanFile(path)print('选择文件夹查询结束!!')input("按下任意键结束程序!!!")except Exception as e:print(e, "未选择路径")
else:if sys.version_info[0] == 3:ctypes.windll.shell32.ShellExecuteW(None, 'runas', sys.executable, __file__, None, 1)# else:# ctypes.windll.shell32.ShellExectueW(None,u'runas',unicode(sys.executable,unicode(__file__),None,1))
4 到这里了,整个小工具,以我的理解能力介绍完了,我是觉得自己写这个还行,整个工具还是有点粗糙,但是应该有用,即使没有实际作用,也算是增强自己对代码的熟练把
5 最后可以通过:pyinstaller -F DelSomeFile.py 将脚本打包成一个真正的exe小工具了 ,如果喜欢可以像我一样给它加个图标(那就这样pyinstaller -i "xx.ico"-F DelSomeFile.py,这个是用相对路径,相对路径成功使用是建立在xx.ico和DelSomeFile在同一个文件夹下,如果不在就用绝对路径)
6 运行截图: