Расчет размеров каталогов действительно не является сильной стороной Python, как объясняется в этом посте: очень быстро получает общий размер папки . Если у вас есть доступ к du
и find
, обязательно используйте это. Вы можете легко отобразить размер каждого каталога с помощью следующей строки:
find . -type d -exec du -hs "{}" \;
Если вы настаиваете на этом на python, вы можете предпочесть обход после заказа вместо os.walk
, как это предлагает PableG. Но использование 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)