Уведомления

Группа в Telegram: @pythonsu

#1 Сен. 16, 2011 12:43:34

lifecoder
От:
Зарегистрирован: 2010-11-02
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Обход дерева

Добрый день, подскажите, как реализовать 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 брал конструкцию, вроде, именно для словаря - может, проблема во вложенных словарях?).

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



Офлайн

#2 Сен. 16, 2011 13:20:43

ZAN
От:
Зарегистрирован: 2007-06-10
Сообщения: 403
Репутация: +  10  -
Профиль   Отправить e-mail  

Обход дерева

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

P.S. Присвоить словарь переменной по имени list нехорошо. Во-первых сбивает с толку, во вторых переопределяет встроенную функцию list.



Офлайн

#3 Сен. 16, 2011 14:29:35

lifecoder
От:
Зарегистрирован: 2010-11-02
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Обход дерева

Ключи - имена папок, строковые; вложенные словари - значение. Или я что-то просмотрел?
List - косяк, недостаточно знаком с питоном, исправлюсь.



Офлайн

#4 Сен. 16, 2011 16:09:25

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Обход дерева

else:
install(data, nextSrc, nextDest, nextBackup) # fixed

Офлайн

#5 Сен. 16, 2011 16:23:49

lifecoder
От:
Зарегистрирован: 2010-11-02
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Обход дерева

ой… Спасибо.

PS: Приведенная ниже строка - это сарказм по поводу моего стиля написания программ? :)



Офлайн

#6 Сен. 16, 2011 16:27:24

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Обход дерева

Отнюдь )

Офлайн

#7 Сен. 16, 2011 17:29:39

lifecoder
От:
Зарегистрирован: 2010-11-02
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Обход дерева

А, понял, это подписи в форуме так хорошо и понятно выделяются. Еще раз спасибо за поправку, всегда самое очевидное сложнее всего найти:)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version