利用python程序帮大家清理windows垃圾
前言
大家应该都有所体会,在windows系统使用久了就会产生一些“垃圾”文件。这些文件有的是程序的临时文件,有的是操作记录或日志等。垃圾随着时间越积越多,导致可用空间减少,文件碎片过多,使得系统的运行速度受到一定影响。
而Mac系统和Linux系统并不存在这类问题,所以只适用于windows
知识概要
某些缓存文件可以提高程序的执行速度,比如缓存cookie、使用记录recent、预读取prefetch等。所以清理临时文件并不代表系统运行就会变快,有时也可能变慢。
windows电脑中的垃圾文件及文件夹主要有哪些?
系统盘%system%下文件类型:
【临时文件(*.tmp)】
【临时文件(*._mp)】
【日志文件(*.log)】
【临时帮助文件(*.gid)】
【磁盘检查文件(*.chk)】
【临时备份文件(*.old)】
【Excel备份文件(*.xlk)】
【临时备份文件(*.bak)】
用户目录%userprofile%下文件夹
【COOKIE】cookies\*.*
【文件使用记录】recent\*.*
【IE临时文件】TemporaryInternetFiles\*.*
【临时文件文件夹】Temp\*.*
Windows目录%windir%下文件夹
【预读取数据文件夹】prefetch\*.*
【临时文件】temp\*.*
获取文件地址
操作需要os模块,如获取工作目录:
importos printos.getcwd()#'E:\\PythonSource\\leanr_py'
切换工作目录:
os.chdir('d://wamp') printos.getcwd()#'d:\\wamp'
获取系统盘符:
os.environ['systemdrive']#'C:'
获取用户目录:
os.environ['userprofile']#'C:\\Users\\Administrator'
获取Windows目录:
os.environ['windir']#'C:\\Windows'
遍历目录
要想遍历文件夹,需要用到os.walk(top,topdown=True,onerror=None)
- 参数top表示需要遍历的顶级目录的路径。
- 参数topdown的默认值是“True”表示首先返回顶级目录下的文件,然后再遍历子目录中的文件。当topdown的值为"False"时,表示先遍历子目录中的文件,然后再返回顶级目录下的文件。
- 参数onerror默认值为"None",表示忽略文件遍历时的错误。如果不为空,则提供一个自定义函数提示错误信息后继续遍历或抛出异常中止遍历。
- 返回值:函数返回一个元组,含有三个元素。这三个元素分别是:每次遍历的路径名、路径下子目录列表、目录下文件列表。
forroots,dirs,filesinos.walk('d://wamp',topdown=False) #roots文件夹路径,dirs该目录下的文件夹列表,files文件列表 printroots#d://wamp printdirs#['bin','www','alias'] printfiles#['wampmanage.conf','1.txt']
判断是否垃圾文件
os.path.splitext()可以对文件名进行切割
extension=os.path.splitext(r'aaa\bbb\ccc.ddd')#('aaa\\bbb\\ccc','.ddd') ifextension[1]in['.tmp','.bak']: print'是垃圾文件'
删除文件
删除文件与删除文件夹调用的是不同的函数。
#删除文件 os.remove('d:temporary/test/test.txt') #删除文件夹 os.rmdir('d:temporary/test/empty')
os.rmdir只能删除空文件夹,如果文件夹非空,则会报错。所以应该用:
shutil.rmtree('d:/dir1/dir2/aaa')
文件正在运行或者受到保护、当前账户没有足够权限时,删除会报错。
最后整理删除函数为:
defdel_dir_or_file(root): try: ifos.path.isfile(root): #删除文件 os.remove(root) print'file:'+root+'removed' elifos.path.isdir(root): #删除文件夹 shutil.rmtree(root) print'directory:'+root+'removed' exceptWindowsError: print'failure:'+root+"can'tremove"
获取文件大小
#显示文件夹(路径)大小,单位bite os.path.getsize('d://temporary/test')#4096 #文件大小 os.path.getsize('d://temporary/test/aaa.txt')#135
完整程序
注意:由于牵涉到文件删除操作,请在动手前务必反复确认代码,万一导致什么重要文件被删.
务必确认!!!
务必确认!!!
务必确认!!!
importos importjson importshutil del_extension={ '.tmp':'临时文件', '._mp':'临时文件_mp', '.log':'日志文件', '.gid':'临时帮助文件', '.chk':'磁盘检查文件', '.old':'临时备份文件', '.xlk':'Excel备份文件', '.bak':'临时备份文件bak' } del_userprofile=['cookies','recent','TemporaryInternetFiles','Temp'] del_windir=['prefetch','temp'] #获取系统盘 SYS_DRIVE=os.environ['systemdrive']+'\\' #获取用户目录 USER_PROFILE=os.environ['userprofile'] #获取Windows目录 WIN_DIR=os.environ['windir'] #获取当前路径os.getcwd()'E:\\Software\\Python27' #跳转至指定的文件目录os.chdir('d://wamp') #获取系统盘符os.environ['systemdrive']'C:' #获取用户目录os.environ['userprofile']'C:\\Users\\Administrator' #获取Windows目录os.environ['windir']'C:\\Windows' defdel_dir_or_file(root): try: ifos.path.isfile(root): #删除文件 os.remove(root) print'file:'+root+'removed' elifos.path.isdir(root): #删除文件夹 shutil.rmtree(root) print'directory:'+root+'removed' exceptWindowsError: print'failure:'+root+"can'tremove" #字节bytes转化kb\m\g defformatSize(bytes): try: bytes=float(bytes) kb=bytes/1024 except: print("传入的字节格式不对") return"Error" ifkb>=1024: M=kb/1024 ifM>=1024: G=M/1024 return"%fG"%(G) else: return"%fM"%(M) else: return"%fkb"%(kb) classDiskClean(object): def__init__(self): self.del_info={} self.del_file_paths=[] self.total_size=0 fork,vindel_extension.items(): self.del_info[k]=dict(name=v,count=0) defscan(self): forroots,dirs,filesinos.walk(USER_PROFILE,topdown=False): #生成并展开以root为根目录的目录树,参数topdown设定展开方式从底层到顶层 forfile_iteminfiles: #获取扩展名 file_extension=os.path.splitext(file_item)[1] #printos.path.join(roots,file_item) iffile_extensioninself.del_info: #文件完整路径 file_full_path=os.path.join(roots,file_item) self.del_file_paths.append(file_full_path) self.del_info[file_extension]['count']+=1 self.total_size+=os.path.getsize(file_full_path) defshow(self): printjson.dumps(self.del_info,indent=4,ensure_ascii=False) print'删除可节省:%s空间'%formatSize(self.total_size) defdelete_files(self): foriinself.del_file_paths: del_dir_or_file(i) if__name__=='__main__': cleaner=DiskClean() cleaner.scan() cleaner.show() if_del=raw_input('是否删除y/n:') ifif_del=='y': cleaner.delete_files()
总结
最近在看一些qt界面的内容。可以结合做一个有图形界面的程序。以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。