编程语言
首页 > 编程语言> > python-目录大小和扩展名

python-目录大小和扩展名

作者:互联网

我想创建python命令行代码,该代码能够打印具有所有子目录(来自某些目录)和最常用扩展名的目录树…我将显示示例输出.

  • root_dir (5 GB, jpg (65 %): avi ( 30 %) : pdf (5 %))

— aa (3 GB, jpg (100 %) )

— bb (2 GB, avi (20 %) : pdf (2 %) )

— bbb (1 GB, …)

— bb2 (1 GB, …)

— cc (1 GB, pdf (100 %) )

格式为:

嵌套级别,目录名称(包含所有文件和子目录的目录大小,此目录中最常用的扩展名和大小百分比).

到目前为止,我有this个代码段.问题在于,它仅计算目录中的文件大小,因此生成的大小小于目录的实际大小.另一个问题是如何在不进行冗余计算的情况下将所有内容放在一起打印我在上面定义的树.

解决方法:

如目录中所述,计算目录大小确实不是python的强项:very quickly getting total size of folder.如果您有权访问du并查找,则一定要使用它.您可以使用以下行轻松显示每个目录的大小:

find . -type d -exec du -hs "{}" \;

如果您坚持要在python中执行此操作,那么您可能会喜欢PableG建议使用post-order traversal而不是os.walk.但是,如果效率不是您的最大考虑因素,则使用os.walk可以在视觉上更简洁:

import os, sys
from collections import defaultdict

def walkIt(folder):
    for (path, dirs, files) in os.walk(folder):
        size = getDirSize(path)
        stats = getExtensionStats(files)

        # only get the top 3 extensions
        print '%s (%s, %s)'%(path, size, stats[:3])

def getExtensionStats(files):
    # get all file extensions
    extensions = [f.rsplit(os.extsep, 1)[-1] 
        for f in files if len(f.rsplit(os.extsep, 1)) > 1]

    # count the extensions
    exCounter = defaultdict(int)
    for e in extensions:
        exCounter[e] += 1

    # convert count to percentage
    percentPairs = [(e, 100*ct/len(extensions)) for e, ct in exCounter.items()]

    # sort them
    percentPairs.sort(key=lambda i: i[1])
    return percentPairs

def getDirSize(root):
    size = 0
    for path, dirs, files in os.walk(root):
        for f in files:
            size +=  os.path.getsize( os.path.join( path, f ) )
    return size

if __name__ == '__main__':
    path = sys.argv[1] if len(sys.argv) > 1 else '.'
    walkIt(path)

标签:directory,file-extension,python
来源: https://codeday.me/bug/20191102/1990265.html