Как создать вложенные словари из таблицы Excel с помощью Openpyxl - PullRequest
0 голосов
/ 23 сентября 2019

Я новичок в программировании и пытаюсь сделать следующее (пока безуспешно):

У меня есть таблица Excel с product codes, sellers и prices и , пытаюсьобновить prices в моей электронной таблице из двух разных электронных таблиц, отправленных оптовыми торговцами.

Я хочу, чтобы программа правильно

  • выполняла поиск в таблице Excel и
  • скопируйте соответствующий price оттуда в правильное местоположение выше.

Итак, я хочу, например:

  • скачать price для product code '92526', продаваемых оптовиком A.

Я хочу оставить производителя price нетронутым.

У меня была программа, которая делала это правильно,
, за исключением того, что я говорил, чтобы она повторялась для каждой строкив моей таблице, и он стирает существующие цены для производителей .

Я хочу словарь в формате:

{92526: {'price': 5.5, 'seller': 'Wholesaler A'}, 
 97056: {'price': 19, 'seller': 'Wholesaler A'}, 
 ...
} 

Я попытался добавить скриншотэлектронной таблицы с примерами данных, но не смог, так что вот так:

Product Code    Seller         Price
92526         Wholesaler A    5.5
97056         Wholesaler A    19
97055         Wholesaler B    15
97054         Wholesaler B    4.5
925AAT        Manufacturer    3.99
925AAF        Manufacturer    6.75

Столбцы не представляют фактические столбцы в моей электронной таблице.

Код, который у меня есть, это (снова, начинающий):

import openpyxl
import pprint

data = {}
files = {'My_main_file':'my_file.xlsx',
         'File_WholesalerA':'FileA.xlsx',
         'File_WholesalerB':'FileB.xlsx'
         }

wb1 = openpyxl.load_workbook(files['My_main_file'])                   
wb2 = openpyxl.load_workbook(files['File_WholesalerA'])                
wb3 = openpyxl.load_workbook(files['File_WholesalerB'])           
sheet1 = wb1.get_sheet_by_name('Master Database')
sheet2 = wb2.get_sheet_by_name('sheetA')
sheet3 = wb3.get_sheet_by_name('sheetB')

# Collect all product codes in my database spreadsheet and add them as keys to the empty dictionary
for row in range(2, sheet1.max_row + 1):
    code = sheet1['E' + str(row)].value
    data[code] = code

# Get Wholesaler A prices and add them to data dictionary
for row in range(2, sheet2.max_row + 1):
    code = sheet2['A' + str(row)].value
    if code in data:
        data[code]['price'] = sheet2['J' + str(row)].value
        data[code]['seller'] = 'Wholesaler A'

# Get Wholesaler B prices and add them to prices dictionary
for row in range(2, sheet3.max_row + 1):
    code = sheet3['A' + str(row)].value
    if code in data:
        data[code]['price'] = sheet3['K' + str(row)].value
        data[code]['seller'] = 'Wholesaler B'

# Paste the prices collected into the dictionary into my excel sheet for each #corresponding product code
for row in range(2, sheet1.max_row + 1):
    code = sheet1['E' + str(row)].value
    if code in data:
        # Here I try to ensure that the code only updates the prices for the 
        # corresponding sellers and doesn't overwrite the prices for 
        # manufacturers.
        if sheet1['C' + str(row)].value == data[code]['seller']:
            sheet1['K' + str(row)].value = data[code]['price']

# Save another version of the spreadsheet with the data
wb1.save('My_main_file v2.xlsx')

pprint.pprint(data)

Ожидаемый результат - программа отсканирует (10k +) строк электронных таблиц Оптовика, найдет цену, соответствующую моему коду продукта, и вставит ее в мой лист, перезаписываястарая цена, но не стирая никакую другую цену.

My inЭта программа сумела собрать цены и вставить их в соответствующие коды продуктов, но она стерла цены производителей, которые были у меня.Эта новая программа по какой-то причине даже не заполняет словарь.

Любая помощь приветствуется.

1 Ответ

0 голосов
/ 24 сентября 2019

Это задание не может быть выполнено

data[code]['price'] = sheet2['J' + str(row)].value
data[code]['seller'] = 'Wholesaler A'

Вы можете попробовать эту структуру, если она вам поможет

data[code] = {'price': sheet2['J' + str(row)].value,
              'seller': 'Wholesaler A'}

Редактировать:

Упомянутое мною назначениевыше можно сделать, но ваш словарь должен знать, что внутри него есть вложенный словарь, как прокомментировал Tomerikoo выше меня, вы можете инициализировать строку data [code] = {}, и тогда она тоже будет работать.Прямо сейчас вы получите сообщение об ошибке: TypeError: объект 'str' / 'int' / etc не поддерживает назначение элементов

...