我有一个目录,我在其中有多个子目录,可能还有子目录中的子目录。
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循环中。如何按上述方式打印?
答案 0 :(得分:0)
首先,试试这个:
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兆字节):
./Sub4/SubSub2 is 1 MB
./Sub4 is 2 MB
./Sub3 is 2 MB
./Sub2 is 1 MB
./Sub1/SubSub1 is 0 MB
./Sub1 is 1 MB
. is 6 MB
答案 1 :(得分:0)
我最终创建了以下功能:
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'
答案 2 :(得分:0)
我发现这个问题正在寻找类似的东西。我受到了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)