Перебор CSV-файла для сопоставления элементов в другом списке

#python #csv

#python #csv

Вопрос:

Я пытаюсь автоматизировать подачу некоторых отсканированных документов. Они идентифицируются по номеру объекта, который необходимо сопоставить с именем задания.

У меня есть список извлеченных имен файлов в папке и CSV-файл, который содержит около 50 000 записей с номерами объектов и заданий. Номера.
Я могу получить правильное соответствие для выбранных номеров заданий с помощью == obj_num[0] etc, Но я не могу понять, как выполнить итерацию по списку.

 import glob,os,csv

items = glob.glob('*.pdf')
obj_num = [".".join(f.split(".")[:-1]) for f in items if os.path.isfile(f)]

job_id = []


with open('locations.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    field_names = ['jobid', 'ItemUniqueId', '###anotherfield', '###anotherfield2']
    for row in csv_reader:
            if row['ItemUniqueId'] == obj_num:
                job_id = row['jobid']
    print(job_id)
  

Ответ №1:

По сути, вы создаете поиск, dict который вы можете использовать для непосредственного поиска JobID на основе связанного ItemID (исходя из имени файла). Таким образом, вы выполняете итерацию один раз по файлу CSV и создаете поиск:

 lookup = {}
with open('locations.csv', 'r') as csv_file:
    csv_reader = csv.DictReader(csv_file)
    field_names = ['jobid', 'ItemUniqueId', '###anotherfield', '###anotherfield2']
    for row in csv_reader:
        lookup[row['ItemUniqueId']] = row['jobid']
  

Затем для каждого имени файла выполняется поиск в поиске, JobID используя ItemID ключ as:

 job_id = lookup.get(item_id) # returns None if not found
job_id = lookup[item_id]     # raises as KeyError if not found
  

Вы также можете проверить, существует ли ItemID в поиске, используя:

 if item_id in lookup:
    # something something something
  

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

 from pathlib import Path

for pdf_file in Path('your path here').glob('*.pdf'):
    file_name_wo_suffix = pdf_file.stem
    job_id = lookup.get(file_name_wo_suffix)
  

Комментарии:

1. спасибо за помощь! Я пробовал выше, и я не могу заставить это работать. Я получаю сообщение об ошибке в строке возврата («вернуть» внешнюю функцию»), но я собираюсь немного подумать и вернуться к этому. Моя конечная цель — добавить номер job_id в каталог, а затем переместить соответствующий PDF-файл в эту папку.

2. извините, return там не должно было быть. Я изменил сообщение, чтобы удалить его.