python读excel数据并写入数据库的方法

读取excel数据需要注意的地方以及读取方式:

  1. python读取excel表时,需要注意对时间的处理:
    原因:
    在使用xlrd读取Excel表格中的日期格式时,读出的内容和原来Excel表格中的内容不一致。读取出来的是一个浮点数。导致不能正确使用。而xldate_as_tuple方法可以很好地解决这个问题。
    函数定义:
def xldate_as_tuple(xldate, datemode)
  • 参数一:要处理的单元格值
  • 参数二:时间基准(0代表以1900-01-01为基准,1代表以1904-01-01为基准,此处一般选择0即可)
    返回值:返回一个元组,他的值类似于(year, month, day, hour, minute, nearest_second)
    在这里插入图片描述
  1. 使用python将时间写入数据库中表里面时,需要注意对时间格式的处理:
    时间需要处理成2020-11-20样式的字符串(具体处理方式详见后面的代码内容),只有这样处理,时间才能自动在数据库被自动转换成datetime或者date类型
  2. 接受数据表中的时间列类型需要设置为date或者datetime类型
drop table tb_msgstock;
create table tb_msgstock
(
Date date not null,
open float not null,
High float not null,
Low float not null,
Close float not null,
Adj_close float not null,
Volume float not null
);
  1. 参考代码如下所示:
import xlrd
import MySQLdb

conn = MySQLdb.connect(host='47.115.130.16', port=3306,
                       database='hrs3', charset='utf8',
                       user='root', password='123Hcl456&',
                       autocommit=False)
# 使用xlrd模块的open_workbook函数打开指定Excel文件并获得Book对象(工作簿)
wb = xlrd.open_workbook('阿里巴巴2017年股票数据.xlsx')
# 通过Book对象的sheet_names方法可以获取所有表单名称
sheetname = wb.sheet_names()[0]
# 通过指定的表单名称获取Sheet对象(工作表)
sheet = wb.sheet_by_name(sheetname)
# 通过Sheet对象的nrows和ncols属性获取表单的行数和列数
print(sheet.nrows, sheet.ncols)
try:
    with conn.cursor() as cursor:
        for row in range(sheet.nrows):
            params=[]
            for col in range(sheet.ncols):
                # 通过Sheet对象的cell方法获取指定Cell对象(单元格)
                # 通过Cell对象的value属性获取单元格中的值
                value = sheet.cell(row, col).value
                # 对除首行外的其他行进行数据格式化处理
                if row > 0:
                    # 第1列的xldate类型先转成元组再格式化为“年月日”的格式
                    if col == 0:
                        # xldate_as_tuple函数的第二个参数只有0和1两个取值
                        # 其中0代表以1900-01-01为基准的日期,1代表以1904-01-01为基准的日期
                        value = xlrd.xldate_as_tuple(value, 0)
                        value = f'{value[0]}-{value[1]:>02d}-{value[2]:>02d}'
                    # 其他列的number类型处理成小数点后保留两位有效数字的浮点数
                    else:
                        value = f'{value:.2f}'
                params.append(value)
            param=tuple(params)
            print(param)
            if row > 1:
                cursor.execute(
                    'insert into tb_msgstock(Date,open,High,Low,Close,Adj_close,Volume) '
                    'values (%s,%s,%s,%s,%s,%s,%s)',
                    param
                )
    print("添加成功")
    conn.commit()

except MySQLdb.MySQLError as err:
    print(err)
    conn.rollback()
finally:
    conn.close()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值