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

Я относительно новичок в 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

1 Ответ

0 голосов
/ 09 апреля 2019

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

Например:

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

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

if row[1] and row[0]:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...