Python, загрузите файл Excel в словарь

#python #openpyxl

Вопрос:

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

 import openpyxl from pathlib import Path  data = {} data['dict1'] = {}  xlsx_file = Path(Path.home(), 'FormaterPythonUniversity', 'Template.xlsx')   wb_obj = openpyxl.load_workbook(xlsx_file)   # Read the active sheet: sheet = wb_obj.active   for i, row in enumerate(sheet.iter_rows(values_only=True)):  data['Full Name'] = row[0]  print(row[0])  data['dict1']['Work email address'] = row[1]  data['dict1']['Start date'] = row[2]  data['dict1']['Manager name'] = row[3]  data['dict1']['Manager email address'] = row[4]  data['dict1']['Category'] = row[5]   print(data)   

Теперь происходит то, что в этом словаре хранится только последняя строка файла excel.

Пример Вывода:

 {'dict1': {'Work email address': 'smth.@gmail.com', 'Start date': '2021-11-11', 'Manager name': 'Paul Smth', 'Manager email address': 'PaulSmth@gmail.com', 'Category': 'Owner'}, 'Full Name': 'Smth Smth'}  

Электронная таблица Excel, которую я использую:

Захват экрана листа Excel

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

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

1. Вы используете статическое значение для индексации своего хэша. С каждой строкой значения предыдущей строки перезаписываются

2. почему вы используете xml в названии поста?

3. Чтобы уточнить то, что сказал Рональд, ключи словаря должны быть уникальными. Это основной принцип диктантов. Ну, есть такая штука, как мультидикт, но давайте пока забудем об этом.

4. @balderman: новые файлы Excel-это XML, но я изменил название, чтобы быть более конкретным.

5. @qamyk, вы продолжаете сохранять строки в одних и тех же ключах словаря data['dict1'] . Составьте data список и вместо этого добавьте в него серию новых словарей.

Ответ №1:

Вы сохраняете каждую строку в одних и тех же ключах данных словаря[‘dict1’]. Составьте data список и вместо этого добавьте в него серию новых словарей:

 data = [] for i, row in enumerate(sheet.iter_rows(values_only=True)):  rowdict = dict()  rowdict['Work email address'] = row[1]  rowdict['Start date'] = row[2]  # (etc.)  data.append(rowdict)  

Выполнено.

Ответ №2:

Если я правильно понял вашу проблему, она коренится в том факте, что вы перезаписываете значение каждого ключа на каждой итерации цикла (т. Е. Соответствует каждой строке электронной таблицы). Возможно, вы захотите попробовать это для каждого столбца перед циклом FOR:

 data['Work email address'] = []  

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

 data['Work email address'].append(row[1])  

Кто-то правильно прокомментировал, что вышеизложенное хранит адреса электронной почты всех пользователей в одном списке. В качестве альтернативы вы можете использовать один из приведенных ниже подходов или свой собственный подход, чтобы получить именно то, что вы хотите.

Альтернативный подход 1:

Вы можете составить список словарей, каждый из которых содержит информацию о строке в вашей электронной таблице.

 data = [] #before the loop ... data.append({'Full Name': row[0], 'Work email address': row[1]}) #inside the loop  

Альтернативный подход 2:

Вы можете составить словарь имен людей (например) и прикрепить их информацию в виде списка к соответствующему ключу:

 data = {} #before the loop ... #then inside the loop employeeName = row[0] data[employeeName] = [row[1], row[2]] # or {'Work email address': row[1], 'Start date': row[2]}  

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

1. Это поместило бы адреса электронной почты всех пользователей в один и тот же список.

2. Спасибо. Я добавил альтернативные подходы. Можно надеяться, что можно найти свой собственный желаемый способ хранения электронной таблицы, используя вышеизложенное. (Также другой ответ на вопрос правильно подсказал полный код, предложенный в моем альтернативном подходе 1.)