Python,加载 Excel 文件到字典

Python, load Excel file to Dictionary

我快疯了。我不明白为什么它只将最后一行保存到字典中。我想将整个 excel table 保存到 Dictionary 中,这样我就可以按 Key(columnName) 对这些值进行分组,然后对这些值进行一些操作,这样我就可以根据行号访问每个单元格。

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 我正在使用的电子表格:

Screen grab of the Excel sheet

我不明白为什么它不将整个内容加载到字典中,而只加载最后一行的信息。

如果我理解你的问题是正确的,它的根源在于你在循环的每次迭代中覆盖每个键的值(即对应于每个 spreadsheet 行)。您可能想在 FOR 循环之前对每一列尝试此操作:

data['Work email address'] = []

然后将 sheet 的每个新读取的行附加到存储在字典中的列表中。所以你的循环中会有类似下面的内容:

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

有人评论正确,上面将每个人的电子邮件地址存储在同一个列表中。您也可以使用以下方法之一或您自己的方法来获得您想要的。

备选方法 1:

您可以制作一个字典列表,每个字典包含您的传播中一行的信息sheet。

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]}

您将每一行保存在字典数据的相同键中['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)

完成。