在工作中,常常会遇到需要将excel 数据导入到数据库的场景。为了方便对数据进行清洗并写入数据库,所以希望能将每一行的数据以字典的形式存放起来,如同 [ {"id":1, "name": "张三"}, ] 这种形式。
下面开始介绍如何进行。首先新建一个测试项目,项目中包含一个py 文件,用于写方法。还有一个待导入的excel 文件:
excel 表的内容如下, 可以看见表格里面的内容较为简单。
以下是详细的代码及分析:
import os
import xlrd
from xlrd import xldate_as_datetime
def parse_excel():
# 打开文件,并获取第一个工作簿的内容
file_name = os.path.join(os.getcwd(), '学生信息表.xlsx')
work_book = xlrd.open_workbook(file_name)
work_sheet = work_book.sheet_by_index(0)
# 获取总行数
total_rows = work_sheet.nrows
# 定义一个列表,用于存放每一行的内容
data_list = []
key_list = None
for i in range(total_rows):
# 获取每一行的内容
row_data = work_sheet.row_values(i)
if i == 0:
# 将第一行的作为字典的key
key_list = row_data
else:
data_dict = dict()
for index, cel_data in enumerate(row_data):
# 获取字典的key
key = key_list[index]
# 注意点01 : 如果该单元格存放的是日期类型,读入的时候,需要借助 xldate_as_datetime 模块
# 具体的用法请自行百度
if index == 7:
if cel_data:
cel_data = xldate_as_datetime(cel_data, 0)
else:
# 注意点02: 单元格是数字的,读取时会识别为浮点数,特此处理一下
if isinstance(cel_data, float):
cel_data = int(cel_data)
# 字典赋值
data_dict[key] = cel_data
# 将字典加入需要返回的列表中
data_list.append(data_dict)
for data in data_list:
print(data)
if __name__ == '__main__':
parse_excel()
打印出来的结果为:
{'序号': 1, '学号': 2019090100001, '姓名': '张三', '年级': '一年级', '班级': '一班', '座位号': 1, '性别': '男', '出生日期': datetime.datetime(2012, 5, 1, 0, 0)}
{'序号': 2, '学号': 2019090100002, '姓名': '李四', '年级': '一年级', '班级': '一班', '座位号': 2, '性别': '男', '出生日期': datetime.datetime(2012, 3, 15, 0, 0)}
{'序号': 3, '学号': 2019090100003, '姓名': '王五', '年级': '一年级', '班级': '一班', '座位号': 3, '性别': '男', '出生日期': datetime.datetime(2012, 6, 3, 0, 0)}
{'序号': 4, '学号': 2019090100004, '姓名': '陈六', '年级': '一年级', '班级': '一班', '座位号': 4, '性别': '男', '出生日期': datetime.datetime(2012, 11, 12, 0, 0)}
{'序号': 5, '学号': 2019090100005, '姓名': '刘七', '年级': '一年级', '班级': '一班', '座位号': 5, '性别': '男', '出生日期': datetime.datetime(2012, 12, 6, 0, 0)}
{'序号': 6, '学号': 2019090100006, '姓名': '梅花', '年级': '一年级', '班级': '一班', '座位号': 6, '性别': '男', '出生日期': datetime.datetime(2011, 9, 8, 0, 0)}
{'序号': 7, '学号': 2019090100007, '姓名': '关九', '年级': '一年级', '班级': '一班', '座位号': 7, '性别': '男', '出生日期': datetime.datetime(2012, 10, 7, 0, 0)}
{'序号': 8, '学号': 2019090100008, '姓名': '赵八', '年级': '一年级', '班级': '一班', '座位号': 8, '性别': '女', '出生日期': datetime.datetime(2012, 4, 18, 0, 0)}
{'序号': 9, '学号': 2019090100009, '姓名': '燕十三', '年级': '一年级', '班级': '一班', '座位号': 9, '性别': '女', '出生日期': datetime.datetime(2011, 12, 28, 0, 0)}
{'序号': 10, '学号': 2019090100010, '姓名': '欧阳清', '年级': '一年级', '班级': '一班', '座位号': 10, '性别': '女', '出生日期': datetime.datetime(2012, 1, 25, 0, 0)}
{'序号': 11, '学号': 2019090100011, '姓名': '东门吹水', '年级': '一年级', '班级': '一班', '座位号': 11, '性别': '女', '出生日期': datetime.datetime(2012, 2, 12, 0, 0)}
{'序号': 12, '学号': 2019090100012, '姓名': '西门硝烟', '年级': '一年级', '班级': '一班', '座位号': 12, '性别': '女', '出生日期': datetime.datetime(2011, 12, 13, 0, 0)}
{'序号': 13, '学号': 2019090100013, '姓名': '西方失败', '年级': '一年级', '班级': '一班', '座位号': 13, '性别': '女', '出生日期': datetime.datetime(2012, 9, 5, 0, 0)}