在python中获取子目录的目录大小

在python中获取子目录的目录大小,python,for-loop,Python,For Loop,我有一个目录,其中有多个子目录,可能还有子目录中的子目录 Folder +-Sub1 | +-SubSub1 | +-File1 +-Sub2 | +-File2 +-Sub3 | +-File3 | +-File4 +-Sub4 +-File5 +-SubSub2 +-File6 我想得到每个子文件夹(Sub1、Sub2等)的整体大小。我还需要得到每个文件夹的名称。例如: Sub1 is 34 MB Sub2 is 2893 MB ... 我目前有以下情况: for r,

我有一个目录,其中有多个子目录,可能还有子目录中的子目录

Folder
+-Sub1
| +-SubSub1
| +-File1
+-Sub2
| +-File2
+-Sub3
| +-File3
| +-File4
+-Sub4
  +-File5
  +-SubSub2
    +-File6
我想得到每个子文件夹(Sub1、Sub2等)的整体大小。我还需要得到每个文件夹的名称。例如:

Sub1 is 34 MB
Sub2 is 2893 MB
...
我目前有以下情况:

for r, d, f in os.walk(directory):
    size = sum(getsize(join(r,n)) for n in f) / 1048576
    print size
    for s in d:
        print s

它打印出所有的大小,后跟所有的目录名,因为它们都在单独的for循环中。如何按上述方式打印?

作为第一步,请尝试以下操作:

import os
for r, d, f in os.walk('.'):
    size = sum(os.path.getsize(os.path.join(r,n)) for n in f) / 1048576
    print "{} is {}".format(r, size)
在我的电脑上,结果如下:

. is 1
./Sub4 is 1
./Sub4/SubSub2 is 1
./Sub3 is 2
./Sub2 is 1
./Sub1 is 1
./Sub1/SubSub1 is 0
这将至少打印相关大小旁边的目录名

作为下一步,您需要找到一种方法,将下级大小相加为父目录的大小。在本例中,我使用字典来记住子目录的大小:

import os
dir_sizes = {}
for r, d, f in os.walk('.', False):
    size = sum(os.path.getsize(os.path.join(r,f)) for f in f+d)
    size += sum(dir_sizes[os.path.join(r,d)] for d in d)
    dir_sizes[r] = size
    print "{} is {} MB".format(r, size/2**20)
结果(每个
FileN
为1兆字节):


我最终创建了以下函数:

def get_size(source):
    total_size = 0
    total_size = os.path.getsize(source)
    for item in os.listdir(source):
        itempath = os.path.join(source, item)
        if os.path.isfile(itempath):
            total_size += os.path.getsize(itempath)
        elif os.path.isdir(itempath):
            total_size += get_size(itempath)
    return float(total_size) / 1048576
然后在我的for循环中调用它:

for d in os.walk(directory).next()[1]:
    size = get_size(directory+d)
    print d + ' is ' + str(size) ' MB'

我发现这个问题在寻找类似的东西。我受到了rjbogz的公认解决方案和Rob的答案的启发ᵩ 做了这个。它提供文件夹所有内容的大小,包括子文件夹的所有内容等

import os
def get_size(source, total_size):
    total_size_in = total_size
    for item in os.listdir(source):
        itempath = os.path.join(source, item)
        if os.path.isfile(itempath):
            total_size += os.path.getsize(itempath)
        elif os.path.isdir(itempath):
            total_size += get_size(itempath, total_size)
    return total_size - total_size_in


def walk_recursive(directory, level):
    for d in next(os.walk(directory))[1]:
        itempath = os.path.join(directory, d)
        size = get_size(itempath, total_size=0)
        if level == 0:
            path = d
        else:
            path = '\\' + d
        print('    '*level +
              '{:6.2f}'.format(float(size) / 1048576) + ' MB  ' + path)
        path = os.listdir(directory)[0]
        if path:
            for f in [path]:
                itempath2 = os.path.join(directory, f)
                if os.path.isdir(itempath2):
                    walk_recursive(itempath, level + 1)


directory = r"<put_your_dir_path_here>"
walk_recursive(directory, level=0)
导入操作系统
def get_大小(源,总大小):
总尺寸=总尺寸
对于os.listdir(源)中的项:
itempath=os.path.join(源,项)
如果os.path.isfile(itempath):
total_size+=os.path.getsize(itempath)
elif os.path.isdir(itempath):
总大小+=获取大小(项目路径,总大小)
返回总大小-总大小
def walk_递归(目录,级别):
对于next(os.walk(directory))[1]中的d:
itempath=os.path.join(目录,d)
大小=获取大小(项目路径,总大小=0)
如果级别==0:
路径=d
其他:
路径='\'+d
打印(“”*级+
“{:6.2f}”。格式(浮点(大小)/1048576)+“MB”+路径)
path=os.listdir(目录)[0]
如果路径:
对于[path]中的f:
itempath2=os.path.join(目录,f)
如果os.path.isdir(itempath2):
遍历递归(itempath,级别+1)
目录=r“”
遍历递归(目录,级别=0)

是否要打印“SubSub1”的大小?不,只打印Sub1。如果Sub1包含在Sub1中,则将其添加到Sub1的总大小中。这是可行的,但出于某种原因,它只是打印出最后一个文件夹和大小,而不是全部。我想这是因为我在寻找d的大小,而不是r的大小。这很奇怪,因为它会打印我电脑上的所有文件夹。我已经更新了我的答案,包括一个完整的可运行程序及其结果。啊,是的,我现在明白了。我最终创建了一个函数来解决这个问题。我将添加一个编辑窗口ᵩ, 在os.walk函数中,将
'。
更改为要为.user1911612打印结果的目录,该代码不适用于我。我有一个错误:size=get\u size(目录+d)尝试将其改为
size=get\u size(str(目录)+str(d))
import os
def get_size(source, total_size):
    total_size_in = total_size
    for item in os.listdir(source):
        itempath = os.path.join(source, item)
        if os.path.isfile(itempath):
            total_size += os.path.getsize(itempath)
        elif os.path.isdir(itempath):
            total_size += get_size(itempath, total_size)
    return total_size - total_size_in


def walk_recursive(directory, level):
    for d in next(os.walk(directory))[1]:
        itempath = os.path.join(directory, d)
        size = get_size(itempath, total_size=0)
        if level == 0:
            path = d
        else:
            path = '\\' + d
        print('    '*level +
              '{:6.2f}'.format(float(size) / 1048576) + ' MB  ' + path)
        path = os.listdir(directory)[0]
        if path:
            for f in [path]:
                itempath2 = os.path.join(directory, f)
                if os.path.isdir(itempath2):
                    walk_recursive(itempath, level + 1)


directory = r"<put_your_dir_path_here>"
walk_recursive(directory, level=0)