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)
完成。
我快疯了。我不明白为什么它只将最后一行保存到字典中。我想将整个 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)
完成。