#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, которую я использую:
Я не понимаю, почему он не загружает все это в словарь, а только информацию из последней строки.
Комментарии:
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.)