Python 目录大小和扩展名

Python 目录大小和扩展名,python,directory,file-extension,Python,Directory,File Extension,我想创建python命令行代码,它能够打印目录树,其中包含所有子目录的大小(来自某个目录)和最常见的扩展名。。。我将展示示例输出 根目录(5GB,jpg(65%):avi(30%):pdf(5%)) --aa(3gb,jpg(100%)) --bb(2GB,avi(20%):pdf(2%)) ---bbb(1GB,…) ---bb2(1GB,…) --抄送(1GB,pdf(100%)) 格式为: 嵌套级别,目录名(包含所有文件和子目录的目录的大小,此目录中最常见的扩展名的大小百分比) 到目前

我想创建python命令行代码,它能够打印目录树,其中包含所有子目录的大小(来自某个目录)和最常见的扩展名。。。我将展示示例输出

  • 根目录(5GB,jpg(65%):avi(30%):pdf(5%))
--aa(3gb,jpg(100%))

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

---bbb(1GB,…)

---bb2(1GB,…)

--抄送(1GB,pdf(100%))

格式为:

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


到目前为止,我有一个代码片段。问题是它只计算目录中的文件大小,因此结果的大小小于目录的实际大小。另一个问题是如何将所有这些放在一起,以打印我上面定义的树,而不必进行冗余计算。

这就是您需要的模块。而且。

@Cldy正确使用os.path

例如,
os.path.walk
将首先遍历参数下面的每个目录,并返回每个目录中的文件和文件夹

使用
os.path.getsize
获取大小并拆分以获取扩展名。将扩展名存储在列表或dict中,并在查看每个扩展名后进行计数


如果您在Linux上,我建议您改为查看
du

我个人认为os.listdir+a_recursive_函数比os.walk更适合此任务:

import os, copy
from os.path import join, getsize, isdir, splitext

frequent_ext = { ".jpg": 0, ".pdf": 0 }     # Frequent extensions

def list_dir(base_dir):
    dir_sz = 0  # directory size
    files = os.listdir(base_dir)
    ext_size = copy.copy(frequent_ext)

    for file_ in files:
        file_ = join(base_dir, file_)

        if isdir(file_):
            ret = list_dir(file_)
            dir_sz += ret[0]
            for k, v in frequent_ext.items():           # Add to freq.ext.sizes
                ext_size[k] += ret[1][k]
        else:
            file_sz = getsize(file_)
            dir_sz += file_sz

            ext = os.path.splitext(file_)[1].lower()   # Frequent extension?
            if ext in frequent_ext.keys():
                ext_size[ext] += file_sz

    print base_dir, dir_sz,
    for k, v in ext_size.items():
        print "%s: %5.2f%%" % (k, float(v) / max(1, dir_sz) * 100.),

    print 

    return (dir_sz, ext_size)


base_dir = "e:/test_dir/"
base_dir = os.path.abspath(base_dir)
list_dir(base_dir)

计算目录大小并不是python的强项,如本文所述:。如果您可以访问
du
find
,请务必使用它。您可以使用以下行轻松显示每个目录的大小:

find . -type d -exec du -hs "{}" \;
如果您坚持用python执行此操作,您可能更喜欢Pableag建议的
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)

这些将是最有用的模块。+1.也许可以加入一个记录扩展和大小的dict。如果你只是想让某人指向某个模块,而不想说任何其他内容,请使用注释。如果你要回答,至少要让他们指向特定的功能,或者告诉他们如何理解它。(我不是落选者,我今天没有选票,但我同意这一点)。我指出这些模块是因为我认为它们足够好,而且文档是不言自明的。也许你是对的,这将更适合作为一个评论。但是文档说了所有的事情,所以我不会改变我的答案。到目前为止,你是否编写了任何代码或制定了任何逻辑?请发布。谢谢你,你的代码教会了我一些好东西在Python中,我尝试使用os.walk,但它的使用相当复杂。你的递归看起来非常优雅。我正在尝试测试它,但它给了我我注意到它崩溃的目录是符号链接。如果可能的话,符号链接可以避免。我现在正在Linux(Ubuntu)上测试它,但主要使用将在Windows 7上。