Как итеративно генерировать дерево каталогов, реализованное на Python?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как итеративно генерировать дерево каталогов, реализованное на Python?

Сообщение Anonymous »

Я уже реализовал создание дерева каталогов с помощью рекурсии:

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

import os
import re
import hashlib

PIPE = "│"
ELBOW = "└──"
TEE = "├──"
PIPE_PREFIX = "│   "
SPACE_PREFIX = "    "

root_dir = ""
tree = []

def extract_number(file_name):
match = re.search(r"\d+", file_name)
return int(match.group()) if match else float("inf")

def get_md5(file_path):
hasher = hashlib.md5()
with open(file_path, "rb") as f:
for chunk in iter(lambda: f.read(8192), b""):
hasher.update(chunk)
return hasher.hexdigest()

def tree_head():
tree.append(f"{root_dir}{os.sep}")
tree.append(PIPE)

def get_entries(directory):
with os.scandir(directory) as entries:
entries = list(entries)

entries = [entry for entry in entries if entry.name != ".DS_Store"]

entries = sorted(entries, key = lambda entry: (entry.is_file(), extract_number(entry.name)))

return entries

def tree_body(directory, prefix = ""):
entries = get_entries(directory)
entries_count = len(entries)
for index, entry in enumerate(entries):
connector = ELBOW if index == entries_count - 1 else TEE
if entry.is_dir():
add_directory(entry, index, entries_count, prefix, connector)
else:
add_file(entry, prefix, connector)

def add_directory(directory, index, entries_count, prefix, connector):
tree.append(f"{prefix}{connector} {directory.name}{os.sep}")

if index != entries_count - 1:
prefix += PIPE_PREFIX
else:
prefix += SPACE_PREFIX

tree_body(directory, prefix)

def add_file(file, prefix, connector):
md5_hash = get_md5(file)
tree.append(f"{prefix}{connector} {file.name} -> {md5_hash}")

def build_tree():
tree_head()
tree_body(root_dir)
return tree

def generate():
tree = build_tree()

for entry in tree:
print(entry)

generate()
Этот код генерирует дерево каталогов с именами файлов и каталогов, а также их хэшами MD5. Вот пример вывода, который может выдать этот сценарий, при условии указанной структуры каталогов:

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

root_dir
│
├── folder1/
│   ├── file1.txt -> d41d8cd98f00b204e9800998ecf8427e
│   └── file2.txt -> 098f6bcd4621d373cade4e832627b4f6
└── folder2/
├── file3.txt -> 6dcd4ce23d88e2ee9568ba546c007c63
└── file4.txt -> d41d8cd98f00b204e9800998ecf8427e
Как можно преобразовать функцию Tree_body() из рекурсивной реализации в итеративную?
Я испробовал множество методов, но мне было трудно их распечатать в правильный порядок.
Я не знаю, как выглядит правильный подход к разработке алгоритма для этой задачи.

Подробнее здесь: https://stackoverflow.com/questions/792 ... -in-python
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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