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. def get_path_depth(root, dirpath):
  5. return dirpath.count(os.path.sep) - root.count(os.path.sep)
  6.  
  7. def human_readable(plain_size):
  8. plain_size = float(plain_size)
  9. if plain_size <= 1024:
  10. return str( round(plain_size, 2)) + 'B'
  11. if plain_size <= 1024 * 1024:
  12. return str( round(plain_size / 1024, 2)) + 'K'
  13. if plain_size <= 1024 * 1024 * 1024:
  14. return str( round(plain_size / 1024 / 1024, 2)) + 'M'
  15. if plain_size <= 1024 * 1024 * 1024 *1024:
  16. return str( round(plain_size / 1024 / 1024 / 1024, 2)) + 'G'
  17.  
  18. def main(root, max_depth, min_size_byte):
  19. total_size = 0
  20. dir_size = {}
  21. for dirpath, dirnames, filenames in os.walk(root):
  22. cur_depth = get_path_depth(root, dirpath)
  23.  
  24. if cur_depth <= max_depth:
  25. assert dirpath not in dir_size
  26. dir_size[dirpath] = 0
  27.  
  28. for filename in filenames:
  29. fullpath = os.path.join(dirpath, filename)
  30. filesize= os.path.getsize(fullpath)
  31.  
  32. total_size += filesize
  33. for dirname in dir_size:
  34. if dirpath == dirname or dirpath.startswith(dirname + os.path.sep):
  35. dir_size[dirname] += filesize
  36.  
  37. root_size = len(root)
  38. for dirname, plain_size in sorted(dir_size.iteritems(), key = lambda d : d[1], reverse = True):
  39. if plain_size < min_size_byte:
  40. break
  41. print human_readable(plain_size), '\t.', dirname[root_size: ]
  42.  
  43. if __name__ == '__main__':
  44. if len(sys.argv) <= 1:
  45. assert False, 'usage show_dir_size path max_depth(with default 0) min_size_byte(with default 1)'
  46. root = sys.argv[1]
  47. if root.endswith(os.path.sep):
  48. root = root[: -1]
  49. max_depth = int(sys.argv[2]) if len(sys.argv) >= 3 else 0
  50. min_size_byte = int(sys.argv[3]) if len(sys.argv) >= 4 else 0
  51. main(root, max_depth, min_size_byte)

  三个参数,第一个是文件夹(path);第二个是显示子文件夹的层数(max_depth, 默认为0); 第三个字数限制文件夹带下(min_size_byte),即size小于这个值得文件夹就不显示了,默认值为1。

  上述代码使用了两个比较关键的函数:os.walk, 遍历路径下的所有文件夹和文件,注意该函数本身就会递归显示子文件夹的内容;第二个函数是os.path.getsize,获取一个文件的大小。

  windows下试一试:

  

  Linux下面试一试:

  

references:

du

python计算文件夹大小(linux du命令 简化版)的更多相关文章

  1. Linux下查看文件和文件夹大小 df,du命令

    转自 http://www.cnblogs.com/benio/archive/2010/10/13/1849946.html df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能 ...

  2. python计算文件夹大小——os.walk

    下面提供一种利用os.walk()快捷的计算指定文件夹大小的方法 话不多说,直接上代码 简略版: import os def get_file_size(file_path, size=0): for ...

  3. Python_计算文件夹大小

    计算文件夹大小 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 os.path.join(path1[, path2[, ...]]) 将 ...

  4. python 计算文件夹里所有内容的大小总和

    计算文件夹里所有内容的大小总和 递归方法 '''计算文件夹的大小''' import os def dir_file_size(path): if os.path.isdir(path): file_ ...

  5. python 获取文件夹大小

    __author__ = 'bruce' import os from os.path import join,getsize def getdirsize(dir): size=0l for (ro ...

  6. Linux下查看磁盘剩余空间和文件夹大小

    1. du -sh 查看当前文件夹大小 2. du -sh * | sort -n 列出当前文件夹下的所有文件夹及其大小,并按照文件夹大小排序 du - sh *  //查看当前文件夹下所有文件的大小 ...

  7. Linux查看一个文件夹大小

    1.Linux查看一个文件夹大小: du -sh /home/yangkun [yangkun@sg1 bin]$ du -sh /home/yangkun/ 164M /home/yangkun/ ...

  8. Linux C++获取文件夹大小

    项目中要计算指定文件夹的大小.百度查到这篇文章,https://my.oschina.net/Tsybius2014/blog/330628方法可行,运行正确. 拿到我们的项目中,却遇到一些问题:程序 ...

  9. NSFileManager计算文件/文件夹大小

    在一些软件中,一般都会给用户展现当前APP的内存,同时用户可以根据自己的需要来清除缓存的内容.一般而言,文件夹是没有大小这个属性的,所以需要遍历文件夹的内容来计算文件夹的大小,下面用NSFileMan ...

随机推荐

  1. java_XML_STAX

    xml文件 <?xml version="1.0" encoding="UTF-8"?> <bookstore> <book ca ...

  2. seq语句随笔

    1.UNION在进行表链接后会筛选掉重复的记录,所以在表链接后会对所产生的结果集进行排序运算,删除重复的记录再返回结果. 2.UNION ALL只是简单的将两个结果合并后就返回.这样,如果返回的两个结 ...

  3. 初识 BFC、 IFC、GFC、FFC

    首先本文中介绍的 BFC. IFC.GFC.FFC 均为 CSS 中常见问题的解读,如没兴趣,可以绕道了. 然后在介绍这么多的 *FC 之前,我们得了解 一下 Box 和 Formatting Con ...

  4. 告诉你 IOS9.0 之后的Bitcode到底是什么!!

    用Xcode 7 beta 3在真机(iOS 8.3)上运行一下工程,结果发现工程编译不过.看了下问题,报的是以下错误: ld: ‘/Users/**/Framework/SDKs/PolymerPa ...

  5. c#导入excel 绑定数据 repeat为例子

    先读取Excel文件并存到dataset public DataSet ExcelToDataTable(string filename, string strsheetname) { try { / ...

  6. MASM32快速起步

    MASM32是一个免费的软件程序,让您编辑Microsoft宏汇编程序(MASM)代码从一个基本的文本界面.它强调MASM代码各部分以不同的颜色,使其更容易扫描和检测错误.它提供了一个简单的布局程序员 ...

  7. 前端学PHP之正则表达式基础语法

    前面的话 正则表达式是用于描述字符排列和匹配模式的一种语法规则.它主要用于字符串的模式分割.匹配.查找及替换操作.在PHP中,正则表达式一般是由正规字符和一些特殊字符(类似于通配符)联合构成的一个文本 ...

  8. 从 http 升级到 https 过程中遇到的一些问题

    Apple 2017年1月1号起要求Appstore 上线的应用都必须使用 https 加密请求协议,在二月份又改为建议 从 http 升级为 https 协议,此为背景. 公司做的APP同时在App ...

  9. php的empty()和isset()用法

    共同点: 1.都可以判定一个变量是否为空: 2.都返回boolean类型,即true或false. 区别: 1.isset()用来检测变量是否设置,只能用于变量,因为传递任何其它参数都将造成解析错误. ...

  10. Java设计模式之接口型模式总结

    摘要: 原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6508967.html 之前认真学习了Java设计模式中的四大接口型模式,分别为:适 ...