zoukankan      html  css  js  c++  java
  • python计算文件夹大小(linux du命令 简化版)

      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), '	.', 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:

    du

  • 相关阅读:
    RDIFramework.NET ━ .NET快速信息化系统开发框架钜献 V2.9 版本震撼发布
    免费的海量编程中文书籍索引-都是干货【强烈建议收藏】
    SQLServer2005+附加数据库时出错提示操作系统错误5(拒绝访问)错误5120的解决办法
    实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-Web
    RDIFramework.NET 框架之组织机构权限设置
    实例演示使用RDIFramework.NET 框架的工作流组件进行业务流程的定义—请假申请流程-WinForm
    RDIFramework.NET ━ 9.16 案例模块━ Web部分
    RDIFramework.NET ━ 9.15 个性化设置 ━ Web部分
    RDIFramework.NET ━ 9.14 数据库连接管理 ━ Web部分
    RDIFramework.NET ━ 9.13 系统日志与系统异常管理 ━ Web部分
  • 原文地址:https://www.cnblogs.com/xybaby/p/6601655.html
Copyright © 2011-2022 走看看