Найти - Пользователи
Полная версия: Обход дерева
Начало » Python для новичков » Обход дерева
1
lifecoder
Добрый день, подскажите, как реализовать for-in для вложенных объектов, или как иначе решить задачу.

Делаю замену файлов с бекапом, в два этапа. Первый - прохожу по реальному дереву файлов, и сохраняю структуру во вложенные словари, последний уровень (сами файлы) - в set, хранящийся по зарезервированному ключу словаря.

import os, shutil
src = "res" #from
dest = "D:/test/" #to
backup = "D:/test/backup"

def walker(src):
list = {"+files":[]} #create dict with reserved space for files
for file in os.listdir(src):
fullPath = os.path.join(src, file)
if os.path.isdir(fullPath):
list[file] = walker(fullPath) #if item is dir - move deeper
else:
list["+files"].append(file) #else add as filename

if not len(list["+files"]):#on no files in directory - remove empty item
del list["+files"]
return list


def install(tree, src, dest, backup):
for folder, data in tree.iteritems():
nextSrc = os.path.join(src, folder)
nextDest = os.path.join(dest, folder)
nextBackup = os.path.join(backup, folder)

#for files in current folder backup original and replace
if folder == "+files":
for file in data:
fileFrom = os.path.join(src, file)
fileTo = os.path.join(dest, file)
fileBackup = os.path.join(backup, file)
shutil.copyfile(fileTo, fileBackup)
shutil.copyfile(fileFrom, fileTo)
#else if this is folder - dig down
else:
install(tree[data], nextSrc, nextDest, nextBackup)


tree = walker(src)
install(tree, src, dest, backup)

print 'ok!'
В отладчике смотрел - дерево собирается корректно. При вызове install() ругается на то что dict не хэшируем (хотя в примере из документации по looping techniques брал конструкцию, вроде, именно для словаря - может, проблема во вложенных словарях?).

Можно сделать копирование прямо в первом проходе, без построения дерева, но это мне кажется менее красивым и более громоздким решением (с учетом того что будет опция восстановления из бекапа). Ну и в любом случае, хотелось бы понять, в чем моя ошибка.
ZAN
lifecoder
может, проблема во вложенных словарях?
Проблема в том, что словарь нельзя исползовать в качестве ключа в другом словаре.
Также не рекоммендуется использовать в качестве ключей и другие изменяемые объекты.

P.S. Присвоить словарь переменной по имени list нехорошо. Во-первых сбивает с толку, во вторых переопределяет встроенную функцию list.
lifecoder
Ключи - имена папок, строковые; вложенные словари - значение. Или я что-то просмотрел?
List - косяк, недостаточно знаком с питоном, исправлюсь.
s0rg
else:
install(data, nextSrc, nextDest, nextBackup) # fixed
lifecoder
ой… Спасибо.

PS: Приведенная ниже строка - это сарказм по поводу моего стиля написания программ? :)
s0rg
Отнюдь )
lifecoder
А, понял, это подписи в форуме так хорошо и понятно выделяются. Еще раз спасибо за поправку, всегда самое очевидное сложнее всего найти:)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB