python自学之《21天学通Python》(17)——第20章 案例1 做一个Windows 上的360工具

news2024/11/16 8:55:53

Python的语法简洁而清晰,具有丰富和强大的类库及第三方库。它能够很轻松地将各种语言模块联结在一起,所以被称为“胶水”语言。当然,Python也能够方便快捷地编写一些常用的工具程序,而用其他程序设计语言需要编写很复杂的代码来完成的功能,通过Python的类库,可能只需要几行代码就能完成同样的功能。

利用Python的这种快速开发特性,在日常计算机维护方面,Python就大有用武之地。可以利用Python语言编写各种系统维护的程序,甚至还可以用它来开发远程维护或监控计算机系统的程序。本章将介绍一些典型的应用场景和实际案例。

20.1 案例背景

Windows用户都有这样的体会,计算机使用一段时间后,感觉速度越来越慢,不但启动时速度变慢,启动后的运行速度也越来越慢。这是因为Windows操作系统在运行过程中会不断地产生垃圾文件,安装、卸载、使用应用程序,也会产生垃圾文件。

这些垃圾文件随着计算机的使用越来越多,如果得不到及时的清理,将会影响到计算机系统的运行速度。既然知道是由于垃圾文件的原因造成计算机速度变慢,那么解决方法也就有了,就是将这些垃圾文件及时清理掉。

清理垃圾文件的方式有多种:

第一种方法,逐个盘符、目录查看是否存在垃圾文件,若有,则删除;
第二种方法,借助一些工具软件,通过这些软件可以轻松地扫描、删除垃圾文件;
第三种方法,利用所学的Python知识,自己编写清理垃圾文件的程序。

这几种方法各有优缺点:

第一种方法由人工去分辨垃圾文件,可以很自由地决定哪些是垃圾文件,但是费时费力,效率很低;
第二种方法省时省力,但其缺点是只能清理该软件认识的垃圾文件,对于一些由特殊软件产生的垃圾文件则无法辨识;

第三种方法是由Python程序去代替人工辨识垃圾文件,当有特殊的文件类别需要清理时,可以通过修改Python程序快速地删除这些文件。因此,这种方式有第一种方法的灵活性,且效率又有很大提高。当然,刚开始编写的清理程序功能不是很完善,需要用户在使用过程中不断提出新需求,逐步完善其功能。

本章的案例主要考虑以下几方面,编写Python程序解决这些问题。
(1)扫描垃圾文件,统计垃圾文件数量及大小;
(2)删除垃圾文件;
(3)扫描计算机中的大文件,并列出指定大小的文件;
(4)查找匹配部分文字名字符的文件。

本章将编写Python程序来解决这些问题。当然,计算机维护还有很多功能,参照本章编写的Python程序,你也可以自己编写代码来解决问题。这样,随着需求不断地增多,最终就可得到一个比较完善的维护计算机的Python程序。

20.2 从创建图形化界面开始

根据上节分析的需求,本章的案例需要完成多项功能,可以将每一项功能单独编写一个Python程序,在使用时分别执行这些程序即可。为了方便使用,最好将这些功能集成在一起,并使用图形化界面。这样,通过单击鼠标就可选择执行相应的功能。

20.2.1 创建基本图形化工作界面

在编写创建GUI的程序之前,要先对需求进行分析,划分出功能模块,如图24.1所示是一种功能模块划分方式。在这个图中,将功能分为“搜索”和“清理”两部分,分别完成搜索文件和清理垃圾文件的功能。另外增加了一个“系统”,主要用来提供退出的功能。(图20.1功能模块划分)

在这里插入图片描述

从图20.1所示功能模块划分可看出,PytOptimize需要完成6项工作,功能不算太多,可以考虑在GUI界面中创建6个按钮,每个按钮连接一个功能。但是,这种通过按钮的方式不方便以后扩展,如果以后功能扩展到几十个,显然就不适合使用按钮了。对于功能项很多的程序,最好就是使用菜单。因此,本例也使用菜单来驱动。

注意: 在项目实施前,一般都要事先对程序所要完成的功能进行规划或设计,以便于划分模块或代码,使代码结构清晰,并容易实施代码的编写。

编写以下Python程序,通过使用tkinter模块创建用户界面:

在这里插入图片描述
在这里插入图片描述

运行以上程序,将显示如图24.2所示的窗口。在窗口上方显示了3个下拉菜单,分别对应图24.1所示的模块。在菜单下方是一个列表框,用来显示最终处理结果,列表框右侧添加了一个垂直滚动条,当列表框中的内容太多时,可通过这个滚动条快速移动。在窗口的最下方还加了一个标签,用来显示当前正在扫描处理的文件。

在这里插入图片描述

20.2.2 响应菜单事件

在如图20.2所示窗口中单击选择“系统”→“退出”菜单命令,窗口并不会被关闭。这是因为还没有为菜单创建事件程序,因此,这里只有单击窗口右上角的关闭按钮来关闭窗口了。

接下来就为菜单创建事件程序。将Findfatl.py另存为Findfat2.py,然后进行修改,将每个子菜单项都添加上command设置,修改后的代码如下:

#coding:utf-8
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类似的,还需对“清理”和“搜索”这两个下拉菜单中的菜单项编写相应的响应函数。由于还没有编写实现其功能的程序,这里就暂时编写一个替代程序(例如,当选择该菜单命令时,就显示一个对话框),到后面完成相应的功能程序时,再替换就行了。

注意: 一般来说,这种“暂时替代程序”可以让主程序暂时能够正常运行,以方便调试代码。

在这里插入图片描述
在这里插入图片描述
经过以上修改,程序又能正常运行了。运行后将显示一个窗口,选择菜单“系统”→“关于”命令,将弹出一个信息提示窗口,如图20.3所示。当然,选择其他菜单命令也会弹出相应的信息提示窗口。现在,选择“系统”→“退出”命令,就可关闭窗口了。

在这里插入图片描述

20.3 清理垃圾文件

GUI界面制作完成之后,接下来就该编写程序来实现相应的功能了。首先来实现清理垃圾文件的功能,在“清理”下拉菜单中有两个子菜单项“扫描垃圾文件”和“删除垃圾文件”。要完成这两项功能,都需要找到垃圾文件所在位置,由于计算机中垃圾文件的分布是随机的,在各子目录中都有可能有垃圾文件,因此,首先就需要编写程序对目录进行遍历。

20.3.1 迭代目录

要遍历目录,有其他程序设计语言经验的读者首先就可以想到,可以使用递归算法来进行遍历。例如,如下程序就可遍历“C:\python32”目录,将该目录及其子目录中的文件名逐个输出。

在这里插入图片描述
在这里插入图片描述

在上面的程序中,首先使用os模块中的listdir方法获取传入参数(目录)中的所有文件和子目录,然后循环处理。具体的处理过程是:首先输出当前项(文件或目录)的名称(使用join方法将父目录名和当前项连接起来),然后判断当前项为目录,则递归调用traverse函数处理下层子目录。有关递归算法的用法,可参考算法相关的书籍。

当然,在以上程序中将函数traverse的参数换成其他目录,就可以遍历相应目录下的文件了。另外,在上面的遍历程序中,只是输出文件名,也可以这里的输出操作换成其他操作。

在Python中,os模块提供了一个名为walk的函数,这个函数就可以完成递归的功能。该函数将返回一个元组(root,dirs,files),其中的root表示当前目录,dirs是当前目录下的所有子目录,而files则表示当前目录下的所有文件。下面的程序可完成对指定目录的遍历,并输出文件名(与traverse.py程序的功能相同):

在这里插入图片描述
在这里插入图片描述

20.3.2 扫描垃圾文件

学会编写程序遍历目录后,再回到案例中来,接下来就可编写程序,遍历目录找出所有的垃圾文件,并进行统计。

在这里,先对垃圾文件进行定义。最简单的方法就是通过文件的扩展名进行界定,例如扩展名为tmp、bak、old、wbk、xlk、_mp、log、gid、chk、syd、$$$、、~*等的文件都是垃圾文件(当然这个列表可以扩充)。因此,在遍历目录时就可判断文件扩展名是否为列表中的内容,若是,则该文件就是垃圾文件。

将上节中编写的Findfat2.py另存为Findfat3.py,然后进行修改。

首先在程序开始处编写以下内容,导入os和os.path模块(处理文件需要使用),然后将定义为垃圾文件的扩展名保存到一个全局变量rubbishExt列表中。

#coding:utf-8
在这里插入图片描述
对于rubbishExt列表可进行扩展(注意,这里将log定义为垃圾文件,很多日志文件的扩展名为log,如果调试或分析系统时需要用到,则不要将其定义为垃圾文件进行删除)。

接着,在Windows类中编写以下函数,进行垃圾文件扫描。

在这里插入图片描述
在这里插入图片描述
最后,修改函数MenuScanRubbish,只需要在原有程序下方增加一行调用ScanRubbish函数即可,修改后的MenuScanRubbish函数如下:

在这里插入图片描述
在这里插入图片描述

20.3.3 多线程加速

出现这个问题的原因是什么呢?在Python程序遍历目录时需要用很长的时间,可能是几分钟,也可能是几十分钟甚至几个小时。在执行遍历程序时,窗口就无法响应其他操作。因此,就出现了前面的这些问题。

该怎么办?这时就应该使用Python的多线程操作了,将耗时的操作用另一个后台线程去进行,则前台GUI界面仍然可响应用户操作。

在使用多线程,需要导入threading模块,继续修改Findfat.py程序,在前面添加导入threading模块的程序,修改内容如下:

在这里插入图片描述
在这里插入图片描述

20.3.4 扫描垃圾文件扫描所有磁盘

到目前为止,已经编写完成了扫描垃圾文件的程序。但是,还有一问题,前面的扫描程序都扫描C盘,没有对其他硬盘进行扫描。

接下来编写程序,对所有磁盘进行扫描。将Findfat3.py程序另存为Findfat4.py,然后开始新功能的扩展。

在Python的os和os.path模块中没有提供获取当前计算机盘符的方法(盘符只是DOS或Windows中才有的概念),不过,也可以通过编写Python程序来获取当前计算机中有哪些盘符。以下程序就是一种方法。

在这里插入图片描述
在以上函数中,循环处理整数65~90,将这些整数通过Chr方法转换为字母A~Z,分别表示Windows中的A盘~Z盘,通过os.path.isdir方法判断“C:/”~“Z:/”是不是一个有效的目录,如果是,则表示存在这个盘符。函数最后返回一个元组。

获取所有盘符后,接下来还需要修改ScanRubbish函数,将该函数修改为可接受一个元组参数scanpath(元组参数中保存中盘符或一系列目录),然后在循环扫描代码部分添加一个外层循环,循环处理参数scanpath中的每一个元素,具体程序修改为如下形式:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最后,还需要修改MenuScanRubbish函数,在该函数中调用GetDrives函数获取所有盘符,再将这些盘符作为参数传递给
ScanRubbish函数(在初始化线程时传入),程序修改为如下形式:

在这里插入图片描述
运行Findfat4.py,选择菜单“清理”→“扫描垃圾文件”命令,Python将对当前计算机中所有磁盘进行扫描,最后得到如图20.6所示的结果。

注意: 当计算机中有多个磁盘,且保存的文件较多时,这个扫描过程将需较长时间。

在这里插入图片描述

20.3.5 删除垃圾文件

下面编写删除垃圾文件的程序,将Findfat4.py另存为Findfat5.py,开始编写新的程序。删除垃圾文件的程序与扫描垃圾文件的程序相似,只是在找到垃圾文件后增加一条删除文件的程序代码即可。需要注意的是,在Windows中有些临时文件是系统当前正在使用的,无法删除。因此需要增加一个异常处理,当删除出现异常时跳过即可。删除垃圾文件的函数如下:

在这里插入图片描述
在这里插入图片描述

20.4 搜索文件

其实,编写好扫描垃圾文件的程序后,再编写搜索文件的程序就很简单了。同样是遍历计算机中所有磁盘,然后再匹配指定条件即可。

20.4.1 搜索超大文件

虽然现在计算机中的硬盘容量越来越大,但是随着使用时间延长,总感觉硬盘空间不够用。每隔一段时间,就会为腾出更多磁盘空间进行一番操作。

其实,经常会有很多非常大的文件藏在磁盘的某一个角落,可能这些文件几年都没有使用过。将这些文件找出来,转移到移动硬盘(或直接删除),就可让硬盘空出一定的空间。

如果人工逐个目录去查找,费时费力,还有可能遗漏。这时,当然就该Python出场了。接着上节的案例继续编写搜索大文件的程序,将Findfat5.py程序另存为Findfat6.py,就可以开始编写程序了。在搜索大文件之前,需要用户确定大文件的界限,即多大的文件算大文件。最好的方式就是使用tkinter的标准对话框。在前面的程序中使用了tkinter.messagebox模块中的方法来显示信息,而接收用户输入的标准对话框可使用tkinter.simpledialog模块中的相关方法。因此,首先需导入该查模块。如下所示程序导入tkinter.simpledialog模块。

在这里插入图片描述
接下来修改MenuScanBigFile函数,将该函数原有程序全部删除,改写为以下内容:

在这里插入图片描述
在上面的程序中,首先调用tkinter.simpledialog.askinteger方法,接收用户输入一个文件大小的整数值,接着创建一个线程,在线程构造函数中调用ScanBigFile函数搜索大文件,并将用户输入的文件大小s作为元给传入。

最后编写ScanBigFile函数,具体内容如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在上面的程序中,遍历计算机中所有磁盘的每一个目录,通过os.path.getsize方法获取文件的大小,然后和传入的参数filesize进行比较,若比filesize大,则找到一个大文件,将其添加到列表框中。

运行Findfat6.py程序,选择菜单“搜索”→“搜索大文件”命令,将显示如图20.8左图所示的对话框,输入文件大小,单击“OK”按钮开始搜索大文件,最后的结果如图20.8右图所示。

在这里插入图片描述

20.4.2 按名称搜索文件

与搜索大文件类似,要搜索文件名中包含部分字符的文件,也需要用户输入要搜索文件名的部分字符,然后遍历磁盘各目录,逐个比对文件名。

首先修改MenuSearchFile函数的程序,将原来该函数中的内容全部删除,改为以下内容:

在这里插入图片描述
以上程序中首先让用户输入文件名中的部分字符,然后创建一个线程,调用SearchFile函数,传入用户输入的字符串进行搜索。接着编写SearchFile函数的代码如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在以上程序中,使用upper函数将传入的文件名部分字符转换为大写,接着遍历计算机磁盘的目录,用find方法逐个比较文件名字符,如果有相同的内容(即find函数返回值大于等于0,若find函数返回值为-1,则表示没有相同字符串)表示找到一个文件,将其添加到文本框中即可。

运行Findfat7.py程序,选择菜单“搜索”→“按名称搜索文件”命令,将弹出一个对话框,在其中输入要搜索文件名的部分字符,如图20.9左图所示。单击“OK”按钮,Python就开始搜索计算机中是否存在文件名中包含“Findfat”的文件,经过一段时间的搜索,最后得到如图20.9右图所示的结果。

在这里插入图片描述

20.5 小结

本章介绍了用Python编写Windows优化程序的案例,案例中综合运用了GUI设计、多线程、文件目录访问等多个知识点。这个案例主要完成了3部分功能:首先演示了使用tkinter模块创建GUI界面的全过程;接着介绍了遍历目录程序的编写方法,在此基础上,通过遍历目录,对计算机中的垃圾文件进行扫描、删除操作;最后还通过遍历完成文件的搜索功能。在本案例中,为了使图形界面能随时响应用户操作,对遍历目录这种耗时操作使用了多线程技术进行处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381276.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法训练营 day60 动态规划 回文子串 最长回文子序列

算法训练营 day60 动态规划 回文子串 最长回文子序列 回文子串 647. 回文子串 - 力扣(LeetCode) 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的…

DIY-BETAFPV和DIY(ESP-01F+E19-900M20S2模块)915MHz信号测试对比

DIY-BETAFPV和DIY(ESP-01FE19-900M20S2模块)915MHz信号测试对比1. 前提条件2. 实测效果2.1 起点附近(距离3m左右)2.2 30m米距离(树梢)2.3 80米距离3. 整体比较4. PCBA分析4.1 DIY-BETAFPV4.2 DIY&#xff0…

node的多版本控制器,nvm,nvm使用,nvm安装

缘起 拿到新项目,第一步当然是启动项目,对于超大型项目,一个npm install 成功与失败,就是五五开。 原因如下: karma1.7.1: wanted: {"node":"0.10 || 0.12 || 4 || 5 || 6 || 7 || 8"} (curren…

rewrite 复现细节以及相关配置

github链接:https://github.com/kaonashi-tyc/Rewrite 网络的结构框架以及相关参数: 每个卷积层后面是一个批处理归一化层,然后是一个ReLu层,一直到零填充。 正如Erik的博客中提到的,该网络针对预测输出和地面真相之间的像素级MAE(平均绝对误差)最小化,而不是更常用的M…

Spring boot ResponseBodyAdvice接口全局统一返回控制,Api返回值是String 类型时异常

ResponseBodyAdvice简介在大部分前后端分离项目中,后端的返回值基本都需要包装成一个GlobalResponse,其中属性有code、message、data等,来供前端使用。这样就导致大部分Api写完后都需要手动构建一个GlobalResponse对象并填充属性返回&#xf…

如何使用BWASP对Web应用程序进行安全漏洞手工分析

关于BWASP BWASP是一款针对Web应用程序安全的开源工具,在该工具的帮助下,广大研究人员可以通过手工方式对Web应用程序进行漏洞分析。 BWASP工具可以通过对漏洞的分析来给广大研究人员提供预测信息,而无需对目标执行实际的渗透测试。 BWASP…

【STM32】cmsis-dap调试器-OpenOCD功能集成进CubeIDE中

前言 被自己买的Jlink真是要整烦了 一下连不上,一下固件掉升级,一下说是D版不给调试 于是乎决定,我买了个CMSIS-DAP调试器,决定放弃JLink这等#$%^&货… CMSIS-DAP 调试器 这个是开源调试器,硬件软件开源&#x…

Vue项目如何进行部署?是否有遇到部署服务后刷新404问题?

一、如何部署 前后端分离开发模式下,前后端是独立部署的,前端只需要将最后的构建物上传至目标服务器的Web容器指定的的静态目录下即可 我们知道vue项目在构建后,是生成一系列的静态文件 常规布署我们只需要将这个目录上传至目标服务器即可…

【Java】StringBuffer、StringBuilder

1. StringBuffer、StringBuilder、String对比 String:不可变的字符序列;对于增删改效率最低StringBuffer:可变的字符序列;jdk1.0声明;线程安全(使用了synchronized同步方法),所以效…

什么是工业物联网(IIoT)?

什么是工业物联网(IIoT)?工业物联网(IIoT) 被定义为一组设备和应用,允许大企业创建从核心到边缘的端到端连接环境。其还包括传统的物理基础设施,如集装箱和物流卡车,以收集数据,对事件做出反应,并在智能设备的帮助下做…

2023中国绿色铝业国际峰会 演讲嘉宾确认

2023中国绿色铝业国际峰会将以“双碳”目标下的铝业发展为主题,结合最佳案例和实践分享,探讨绿色铝业发展路径和最新技术,致力于打造一个绿色可持续的铝行业,助力中国实现“碳中和”目标。 会议时间/地点/主办方 2023年3月23日-…

JavaSE14-面向对象-修饰符

文章目录一、权限修饰符和包1.权限修饰符2.包二、static1.静态成员的调用格式2.注意事项3.static内存图4.使用场景三、final一、权限修饰符和包 1.权限修饰符 使用权限修饰符来控制被修饰的成员(如成员变量)的使用权限Java中有四种权限修饰符&#xff…

zabbix中的JMX监控、集成告警平台、分布式监控

文章目录前言一、zabbix中的JMX监控二、集成告警平台:zabbix监控结合睿象云报警三、分布式监控1.agent端主动回传数据2.proxy代理前言 一、zabbix中的JMX监控 JMX介绍: Jmx(Java Management Extensions)java管理拓展 JMX特点&…

linux代码库生成-make示例

1、add.c代码实现加法运算: int add(int a,int b) { return ab; } 2、头文件add.h #ifndef ADD_H #define ADD_H int add(int a,int b); #endif 3、CMakeLists.txt编写 cmake_minimum_required(VERSION 2.6) set(CMAKE_C_FLAGS -m32) project(test_add) include_dir…

OpenMLDB 社区月报 | 2023 年 2 月

导言 OpenMLDB 社区每个月都会发布一版社区月报,总结一个月以来的产品动态、社区活动、内容发布等,让大家对我们社区的发展有更加清晰的了解。如果您对我们的社区有任何建议,欢迎在 GitHub 上提 Issues 或 PR ,共同参与社区的建设…

统计学 假设检验

文章目录假设检验假设检验的基本原理提出假设作出决策表述决策结果一个总体参数的检验总体均值的检验总体比例的检验总体方差的检验两个总体参数的检验两个总体均值之差的检验两个总体比例之差的检验两个总体方差比的检验总体分布的检验正态性检验的图示法Shapiro-Wilk 和 K-S …

Vue3 企业级项目实战:通关 Vue3 企业级项目开发,升职加薪快人一步

Vue3 企业级项目实战 - 程序员十三 - 掘金小册Vue3 Element Plus Spring Boot 企业级项目开发,升职加薪,快人一步。。「Vue3 企业级项目实战」由程序员十三撰写,2744人购买https://s.juejin.cn/ds/S2RkR9F/ 课程介绍 很高兴为大家介绍这个…

LeetCode 1326. Minimum Number of Taps to Open to Water a Garden【贪心,桶排序】

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

路由网络的构建与配置

Part.1 ⑴ 需求分析 在构建的局域网中,通过路由器间配置静态路由,实现PC1和PC2主机直接连通,主机网段不能与路由器直接互联网段通信。 ⑵ 环境要求 配置虚拟网卡的计算机,安装华为eNSP模拟软件。 规划拓扑 Part.2 ⑴ 拓扑描述…

NVIC 简介、抢占优先级和响应优先级

NVIC 简介 NVIC 是嵌套向量中断控制器,控制着整个芯片中断相关的功能,它跟内核紧密耦合,是内核里面的一个外设。 如果医院只有医生的话,当看病的人很多时,医生就得安排一下先看谁,后看谁,如果…