背景:
最近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