使用 Python 计算目录的大小?

新手上路,请多包涵

在我重新发明这个特殊的轮子之前,有没有人有一个很好的例程来使用 Python 计算目录的大小?如果例程能够以 Mb/Gb 等格式很好地格式化大小,那就太好了。

原文由 Gary Willoughby 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 317
2 个回答

这将遍历所有子目录;总结文件大小:

 import os

def get_size(start_path = '.'):
    total_size = 0
    for dirpath, dirnames, filenames in os.walk(start_path):
        for f in filenames:
            fp = os.path.join(dirpath, f)
            # skip if it is symbolic link
            if not os.path.islink(fp):
                total_size += os.path.getsize(fp)

    return total_size

print(get_size(), 'bytes')

以及使用 os.listdir 的有趣的单行代码( _不包括子目录_):

 import os
sum(os.path.getsize(f) for f in os.listdir('.') if os.path.isfile(f))

参考:

更新 要使用 os.path.getsize ,这比使用 os.stat().st_size 方法更清楚。

感谢 ghostdog74 指出这一点!

os.stat - _stsize 以字节为单位给出大小。也可用于获取文件大小和其他文件相关信息。

 import os

nbytes = sum(d.stat().st_size for d in os.scandir('.') if d.is_file())

2018 年更新

如果你使用 Python 3.4 或更早版本,那么你可以考虑使用第三方包提供的更高效的 walk 方法 scandir 包。在 Python 3.5 及更高版本中,此包已被纳入标准库,并且 os.walk 获得了相应的性能提升。

2019 年更新

最近我越来越多地使用 pathlib ,这是一个 pathlib 解决方案:

 from pathlib import Path

root_directory = Path('.')
sum(f.stat().st_size for f in root_directory.glob('**/*') if f.is_file())

原文由 monkut 发布,翻译遵循 CC BY-SA 4.0 许可协议

目前建议的一些方法实现递归,其他方法使用 shell 或不会产生格式整齐的结果。当您的代码是针对 Linux 平台的一次性代码时,您可以像往常一样进行格式化,包括递归,作为单行代码。除了最后一行的 print 外,它适用于 python2python3 的当前版本:

 du.py
-----
#!/usr/bin/python3
import subprocess

def du(path):
    """disk usage in human readable format (e.g. '2,1GB')"""
    return subprocess.check_output(['du','-sh', path]).split()[0].decode('utf-8')

if __name__ == "__main__":
    print(du('.'))

简单、高效,适用于文件和多级目录:

 $ chmod 750 du.py
$ ./du.py
2,9M

原文由 flaschbier 发布,翻译遵循 CC BY-SA 4.0 许可协议

推荐问题