Итерация по списку словарей для поиска в каталоге, чтобы найти файлы и скопировать их в новое место

Я относительно новичок в Python и не могу понять, чего мне не хватает в моем коде. Что я пытаюсь сделать, так это создать словарь, содержащий список значений, а затем использовать этот словарь для поиска в каталоге имен файлов, а затем скопировать эти файлы в новую папку (названную в честь ключа, который уже создан). Ключ — это имя контракта, а значения — листы плана контракта, поэтому каждый контракт содержит от 2 до 100 листов. Я заставил код работать, когда каждый ключ имел только одно значение, но теперь, когда это список, он не работает. Любая помощь будет принята с благодарностью!

Я использую arcpy.da.searchcursor для добавления значений в словарь.
Затем я использую itervalues для перебора значений словаря и получаю сообщение об ошибке
ValueError: too many values to unpack.

recDCT = {}
with arcpy.da.SearchCursor (deviceFC, [contract, RECDOC]) as curs:
    for row in curs:
        if row[1] <> None and row[0] <> None:
            if row[0] in recDCT.keys():
                recDCT[row[0]].append(row[1])
            else:
                recDCT[row[0]] = [row[1]]

for root, dirs, files in os.walk(path):
    for key, value in recDCT.itervalues():
        if value in files:
            shutil.copy(os.path.abspath(root + '/' + value), os.path.abspath(outLoc + '/' + key))

Я ожидаю, что скрипт скопирует все файлы для этого ключа в указанный файл папки в новую папку.

** Обновление, нашел решение, которое мне нужно было использовать цикл for для вызова каждой клавиши перед повторением списка.

recDCT = {}
with arcpy.da.SearchCursor (deviceFC, [contract, CurrDP]) as curs:
    for row in curs:
        if row[1] is not None and row[0] is not None:
            if row[0] in recDCT.keys():
                recDCT[row[0]].append(row[1])
            else:
                recDCT[row[0]] = [row[1]]

for root, dirs, files in os.walk(path):
    for key in recDCT:
        for value in recDCT[key]:
            if value in files:
                shutil.copy(os.path.abspath(root + '/' + value), os.path.abspath(outLoc + '/'+ key))
                a += 1
            else:
                pass

person Stephen.H    schedule 09.04.2019    source источник
comment
<> не является оператором в python   -  person ritlew    schedule 09.04.2019
comment
Используйте is not вместо <>   -  person DirtyBit    schedule 09.04.2019


Ответы (1)


Эй, прежде всего, как было сказано ранее, <> не является оператором Python. В python для многих объектов доступно тестирование истинности. Это означает, что пустые объекты или неинициализированные объекты возвращают false в логическом контексте, иначе true.

Например:

bool([]) -> False
bool([1]) -> True
bool(None) -> False

Например, вы можете просто заменить if row[1] <> None and row[0] <> None: следующим кодом. Это более читабельно и более питонично:

if row[1] and row[0]:
person Bierbarbar    schedule 09.04.2019