C盤又滿了,怎么辦?用了一些垃圾清理軟件(或者bat腳本),但是還是不理想,那么具體哪些文件夾下面有巨大的文件呢?windows並不能通過詳細信息看到每個文件夾的大小(PS:這里所謂的文件夾的大小是指文件夾下面所有文件的大小之和,包括子文件夾的大小,下同),道理也很簡單,計算文件夾大小是比較費時的工作。當然,也可以通過屬性查看文件夾大小,但是當一個文件夾下面又有及半個子文件夾的時候,怎么知道哪些比較大的,這個時候不禁想起了linux下面的du命令。
du(disk usage)是查看磁盤使用情況非常有用的一個工具(另外一個是df),具體的使用文檔可以參見鏈接。而本人最常使用的參數是這樣的:
du . -h -d 1
上述命令輸出當前文件夾(.)下面 第一層(-d 1)子文件夾的大小,以human readable(-h)的形式展現, 下面是實際例子:
那windows下面並沒有這樣一個簡單的命令(或者是我不知道?),不過無所謂,用python應該比較簡單:
1 # -*- coding: utf-8 -*- 2 import os, sys 3 4 5 def get_path_depth(root, dirpath): 6 return dirpath.count(os.path.sep) - root.count(os.path.sep) 7 8 def human_readable(plain_size): 9 plain_size = float(plain_size) 10 if plain_size <= 1024: 11 return str( round(plain_size, 2)) + 'B' 12 if plain_size <= 1024 * 1024: 13 return str( round(plain_size / 1024, 2)) + 'K' 14 if plain_size <= 1024 * 1024 * 1024: 15 return str( round(plain_size / 1024 / 1024, 2)) + 'M' 16 if plain_size <= 1024 * 1024 * 1024 *1024: 17 return str( round(plain_size / 1024 / 1024 / 1024, 2)) + 'G' 18 19 def main(root, max_depth, min_size_byte): 20 total_size = 0 21 dir_size = {} 22 for dirpath, dirnames, filenames in os.walk(root): 23 cur_depth = get_path_depth(root, dirpath) 24 25 if cur_depth <= max_depth: 26 assert dirpath not in dir_size 27 dir_size[dirpath] = 0 28 29 for filename in filenames: 30 fullpath = os.path.join(dirpath, filename) 31 filesize= os.path.getsize(fullpath) 32 33 total_size += filesize 34 for dirname in dir_size: 35 if dirpath == dirname or dirpath.startswith(dirname + os.path.sep): 36 dir_size[dirname] += filesize 37 38 root_size = len(root) 39 for dirname, plain_size in sorted(dir_size.iteritems(), key = lambda d : d[1], reverse = True): 40 if plain_size < min_size_byte: 41 break 42 print human_readable(plain_size), '\t.', dirname[root_size: ] 43 44 if __name__ == '__main__': 45 if len(sys.argv) <= 1: 46 assert False, 'usage show_dir_size path max_depth(with default 0) min_size_byte(with default 1)' 47 root = sys.argv[1] 48 if root.endswith(os.path.sep): 49 root = root[: -1] 50 max_depth = int(sys.argv[2]) if len(sys.argv) >= 3 else 0 51 min_size_byte = int(sys.argv[3]) if len(sys.argv) >= 4 else 0 52 main(root, max_depth, min_size_byte)
三個參數,第一個是文件夾(path);第二個是顯示子文件夾的層數(max_depth, 默認為0); 第三個字數限制文件夾帶下(min_size_byte),即size小於這個值得文件夾就不顯示了,默認值為1。
上述代碼使用了兩個比較關鍵的函數:os.walk, 遍歷路徑下的所有文件夾和文件,注意該函數本身就會遞歸顯示子文件夾的內容;第二個函數是os.path.getsize,獲取一個文件的大小。
windows下試一試:
Linux下面試一試:
references: