源码 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,QFileDialog
def is_admin():
try:
return ctypes.windll.shell32.IsUserAnAdmin()
except:
return False
def 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 = filename
try:
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,同理可以判断后缀是否是py
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("未删除")#如果没有输入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 = filename
try:
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 运行截图: