Преобразование нехвостовой рекурсивной функции Python, добавляющей информацию о подпапках в циклPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Преобразование нехвостовой рекурсивной функции Python, добавляющей информацию о подпапках в цикл

Сообщение Anonymous »

Я написал функцию для получения общего размера и общего количества файлов/подкаталогов всего диска или определенной папки. Рекурсивная функция была очень простой:

Код: Выделить всё

# 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»