Я относительно новичок в 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))
Я ожидаю, что скрипт скопирует все файлы для этого ключа в указанный файл папки в новую папку.
** Обновление, выяснил решение Iнеобходимо использовать цикл 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