背景:
最近C盘空间不知道为什么,剩余量非常少,只有13个G,有时仅剩个位数,这还是清理过的存储
查看了半天也找不到是哪个淘气的大文件在占用空间,一怒之下决定自己写一个脚本跑跑看
既然自己做,用其他库就没意思了,当然os库除外,连字典排序也懒得用sort,都自己写得了
具体实现:
就直接贴上源代码吧,原理是,主要用到os.walk和os.path以及os.path.getsize 这三个方法
注释的也已经很详细了,不了解请查看我的另一片关于os.walk的博客~
"""
author:Horizon
time:2020/5/19
目的:给定任何数量的任意文件夹路径,打印这些路径下所有的文件夹占用空间的大小
#并根据占据空间大小降序显示,为了避免打印过长,只显示大于200M的文件夹
"""
import os
class listpath():
def __init__(self,path,*args):
#初始化要查询的文件夹数量可以自由控制,用列表保存
self.paths = []
self.paths.append(path)
if args:
for arg in args:
self.paths.append(arg)
def get_file_path(self):
file_path = []
for path in self.paths:
#root dirs 和files方法,分别代表walk下的根目录
#及里面的所有文件夹和文件,
#原理是root变化后其目录下的dirs和files也会变
for root, dirs, files in os.walk(path):
for file in files:
#将所有文件的路径与根目录连接即可获得绝对路径
file_path.append(os.path.join(root, file))
return file_path
def get_dir_path(self):
#原理同上面的获得文件函数,不同的是这次获得root下所有文件夹
dir_path = []
for path in self.paths:
for root, dirs, files in os.walk(path):
for dir in dirs:
dir_path.append(os.path.join(root, dir))
return dir_path
def print_filepath(self):
#遍历并将所有文件路径打印出来
paths = self.get_dir_path()
for path in paths:
print(path)
def print_dirpath(self):
#遍历并将所有文件夹路径打印出来
paths = self.get_file_path()
for path in paths:
print(path)
#这个函数的主要作用是:
#给定一个弹性路径列表,读取这个路径下的所有文件夹大小
#并以一个字典的方式返回
def get_dirs_size(*args):
dirs = listpath(*args)
dir_size_dict = {}
for dir in dirs.get_dir_path():
#文件夹大小就是文件夹内的所有文件大小之和
files_size = 0
#创建一个listpath实例,目的是获得dir下的所有文件路径
files = listpath(dir)
#遍历所有文件
for file in files.get_file_path():
#将各个文件的存储空间相加
files_size += os.path.getsize(file)
#将得到的值和dir分别最为value和key,返回这个字典
dir_size_dict[dir] = files_size
return dir_size_dict
#将字典的值降序排序,并与key值对应起来
#用两张列表存储,最后再压缩成一张列表
def sort_dict(dict):
keylist = []
valuelist = []
#获取长度
for key in dict:
keylist.append(key)
valuelist.append(dict[key])
#选择排序
for i in range(0,len(valuelist)):
for j in range(i+1,len(valuelist)):
if valuelist[i] < valuelist[j]:
temp = valuelist[i]
valuelist[i] = valuelist[j]
valuelist[j] = temp
temp = keylist[i]
keylist[i] = keylist[j]
keylist[j] = temp
sorted_list = zip(keylist, valuelist)
return sorted_list
#最终调用的函数,将信息打印出来
def print_dirs_size(*args):
res = sort_dict(get_dirs_size(*args))
#依次遍历这张压缩表,就可获得最终结果
for key ,value in res:
size = round(value/(1024**3),2)
#大于200M才打印
if size > 0.2:
print('路径:' , key,'占用空间为:', size, 'G')
if __name__ == "__main__":
print_dirs_size('C:/Users','D:/')
运行结果:实现功能需求,打印正常
搞了半天,原来是C盘下的linux虚拟机占用了将近30个G的空间
当初为了SSD速度快放到C盘,没想到很快就爆满了。。。
这样子的话还真拿它没办法了~~
最后正确性验证,完美实现了预期效果~
更多内容请访问:bookist123.PICP.NET