基于Excel文件生成每行对应字典的Python技术问题求助
解决Excel行转字典列表的问题
看起来你现在的问题是没能正确遍历Excel的每一行并生成独立的字典,我来帮你修正代码并解释问题所在。
修正后的代码
首先,我们用更简洁的方式遍历DataFrame的每一行,并且为每行生成一个完整的事件字典,最后收集到列表中:
import pandas as pd # 读取Excel文件,header=1表示用第二行作为列名 df = pd.read_excel('http://administracja.sgh.waw.pl/en/dsm/schedules/session/Documents/SMMB%2020172%20-%20changes%2017.05.18.xls', header=1) # 初始化一个空列表用于存储所有事件字典 events_list = [] # 遍历DataFrame的每一行 for index, row in df.iterrows(): # 跳过空行(如果存在的话) if pd.isna(row.iloc[0]): continue # 构建单个事件字典,根据你的需求组合字段 event = { 'summary': row.iloc[0], # 第一列作为summary 'location': row.iloc[5], # 假设位置在第6列(索引5),可根据实际列调整 'start': { 'dateTime': f"{row[6].replace(';', ' ')} {row[3]}" # 组合日期和开始时间 }, 'end': { 'dateTime': f"{row[6].replace(';', ' ')} {row[4]}" # 组合日期和结束时间 } } # 将当前事件字典加入列表 events_list.append(event) # 输出结果查看 print(events_list)
原代码的问题分析
- 遍历方式不当:你用while循环配合
iloc[n]的方式不够直观且容易出错,df.iterrows()是Pandas中遍历行的标准方法,能直接获取每行的索引和数据。 - 不必要的内层循环:
for row in events会遍历当前行的每个单元格,这完全没必要——我们只需要从指定列提取值即可。 - 字典拆分与未收集:你把
summary、start、end拆成了多个独立字典,而且没有将生成的事件字典存入列表,导致每次循环都会覆盖之前的结果。
优化建议
为了让代码更健壮,建议使用列名而非索引来取值(避免列顺序变化导致错误)。你可以先打印列名确认:
print(df.columns)
然后替换成类似这样的写法:
event = { 'summary': row['Course Code and Name'], # 替换为实际列名 'location': row['Room'], # 替换为实际列名 'start': { 'dateTime': f"{row['Date'].replace(';', ' ')} {row['Start Time']}" }, 'end': { 'dateTime': f"{row['Date'].replace(';', ' ')} {row['End Time']}" } }
这样代码可读性更强,也更不容易出错。
内容的提问来源于stack exchange,提问作者robsanna
相关产品推荐
相关产品推荐

