Код: Выделить всё
# Make the python dirSize function a non recursive one:
from pathlib import Path
obj = {}
def dirSize(dir: Path, size = 0, files = 0, dirs = 0):
for sub_dir in dir.glob('*'):
if sub_dir.is_dir():
dirs += 1
res_size, res_files, res_dirs = dirSize(sub_dir)
size += res_size
files += res_files
dirs += res_dirs
elif sub_dir.is_file():
files += 1
size += sub_dir.stat().st_size
obj[dir.as_posix()] = {
'size': size,
'files': files,
'dirs': dirs,
}
return size, files, dirs
dirSize(Path('~/Documents').expanduser())
#Line above is for tests. Final code should run in elevated cmd:
#dirSize(Path('C:/'))
with open(Path('~/Desktop/results.tsv').expanduser().as_posix(), 'w') as file:
file.write('Directory\tBytes\tFiles\tDirs\n')
for key in sorted(obj):
dir = obj[key]
file.write(key)
file.write('\t')
file.write(str(dir['size']))
file.write('\t')
file.write(str(dir['files']))
file.write('\t')
file.write(str(dir['dirs']))
file.write('\n')
Код: Выделить всё
size += res_size
files += res_files
dirs += res_dirs
В качестве альтернативы я можно было бы добавить свойства level/parent/child в переменную obj, чтобы получить сумму снизу вверх после обработки очереди. Но это кажется очень громоздким. Есть ли более простой способ добиться этого?
Отвечаем на вопросы, заданные ниже:< /p>
- Почему бы вам просто не использовать os.walk?
- Это немедленно устраняет рекурсию, но не помогает подсчитать сумму снизу вверх — сгенерированный отчет показывает, сколько подкаталогов, дискового пространства и файлов имеет каждый каталог.
- В чем проблема с рекурсивной функцией?
- Нет проблем, все работает идеально! Но не все разработчики умеют работать с рекурсией, поэтому мой начальник попросил меня сделать нерекурсивную версию, и я изо всех сил стараюсь не усложнять ее.
Подробнее здесь: https://stackoverflow.com/questions/786 ... -to-a-loop