一、前言
在上篇中,我已经成功从数据库查询到数据,并根据指定条件将数据写入到excel中,但是写入的数据和我们通过数据库连接工具查询到的结果并不一致,接下来我们就来解决:Python从数据库查询的数据保存到excel中后,数据格式异常的问题
二、解决步骤
分析现象
使用Navicat从数据库查询到的数据是这样的:
Python从数据库查询到的数据是这样的:
将Python从数据库查询到的结果保存到excel中是这样的:
对比后发现,Python从数据库查询的数据保存到excel中:
1.数字较长时展示异常(a_id、m_id)--Mysql中为bigint,excel中丢失精度
2.1展示为b'\x01'(s)--Mysql中为bit,Python中展示异常
3.时间展示为数字--Mysql中为datetime,Excel中展示异常
可想而知,根本原因在于MySQL中的数据类型和Python中的数据类型不匹配
解决问题
既然数据类型不一致,在写入Excel之前,就需要先将数据格式进行处理
这里只判断了数据是否为byte类型和日期类型:
def is_date(val):
"""
判断date_str是否为日期格式
"""
date_format = "%Y-%m-%d"
try:
if isinstance(val, str):
new_str = val[:10]
valid_date = time.strptime(new_str, date_format)
return True
else:
return False
except ValueError or TypeError as e:
return False
def convert_value(val):
"""转换数据格式为excel"""
if isinstance(val, bytes):
val = ord(val)
if is_date(val):
val = datetime.datetime.strptime(val, "%Y-%m-%d %H:%M:%S.%f")
new_val = str(val)
return new_val
在写入excel前调用convert_value(val)方法即可
for idx, val in enumerate(results2):
for i, v in enumerate(val):
new_val = convert_value(val[v])
sheet.write(idx + 1, i, new_val)
展示效果
运行效果如下图所示:
三、总结
1.分析了保存到excel数据格式异常的原因
2.先判断读取的数据类型是否为byte或者datetime类型
3.将数据类型处理为字符串,写入到excel中