使用python将excel数据导入数据库过程详解


Posted in Python onAugust 27, 2019

因为需要对数据处理,将excel数据导入到数据库,记录一下过程。

使用到的库:xlrd 和 pymysql (如果需要写到excel可以使用xlwt)

直接丢代码,使用python3,注释比较清楚。

import xlrd
import pymysql
# import importlib
# importlib.reload(sys) #出现呢reload错误使用
def open_excel():
  try:
    book = xlrd.open_workbook("XX.xlsx") #文件名,把文件与py文件放在同一目录下
  except:
    print("open excel file failed!")
  try:
    sheet = book.sheet_by_name("sheet名称")  #execl里面的worksheet1
    return sheet
  except:
    print("locate worksheet in excel failed!") 
 #连接数据库
try:
  db = pymysql.connect(host="127.0.0.1",user="root",
    passwd="XXX",
    db="XXX",
    charset='utf8')
except:
  print("could not connect to mysql server")
 
def search_count():
  cursor = db.cursor()
  select = "select count(id) from XXXX" #获取表中xxxxx记录数
  cursor.execute(select) #执行sql语句
  line_count = cursor.fetchone()
  print(line_count[0])
 
 
def insert_deta():
  sheet = open_excel()
  cursor = db.cursor()
  for i in range(1, sheet.nrows): #第一行是标题名,对应表中的字段名所以应该从第二行开始,计算机以0开始计数,所以值是1
 
    name = sheet.cell(i,0).value #取第i行第0列
    data = sheet.cell(i,1).value#取第i行第1列,下面依次类推
    print(name)
    print(data)
    value = (name,data)
    print(value)
    sql = "INSERT INTO XXX(name,data)VALUES(%s,%s)"
    cursor.execute(sql,value) #执行sql语句
    db.commit()
  cursor.close() #关闭连接
insert_deta()
db.close()#关闭数据
print ("ok ")

XXX里自行修改自己的名称。

说明:对于不规则的单元格,例如合并过的单元格会取到空值。

优化了一下这个程序

import pymysql
import xlrd 
# 连接数据库
try:
  db = pymysql.connect(host="127.0.0.1", user="root",
             passwd="XXX",
             db="XXX",
             charset='utf8')
except:
  print("could not connect to mysql server") 
def open_excel():
  try:
    book = xlrd.open_workbook("XXX.xlsx") #文件名,把文件与py文件放在同一目录下
  except:
    print("open excel file failed!")
  try:
    sheet = book.sheet_by_name("XXX")  #execl里面的worksheet1
    return sheet
  except:
    print("locate worksheet in excel failed!") 
def insert_deta():
  sheet = open_excel()
  cursor = db.cursor()
  row_num = sheet.nrows
  for i in range(1, row_num): # 第一行是标题名,对应表中的字段名所以应该从第二行开始,计算机以0开始计数,所以值是1
    row_data = sheet.row_values(i)
    value = (row_data[0],row_data[1],row_data[2],row_data[3])
    print(i)
    sql = "INSERT INTO demo_yangben(xxx,xxxx,xxxx,xxxx)VALUES(%s,%s,%s,%s)"
    cursor.execute(sql, value) # 执行sql语句
    db.commit()
  cursor.close() # 关闭连接
open_excel()
insert_deta()

再改一下,每一万条数据写入到数据库一次

import pymysql
import xlrd
import sys 
'''
  连接数据库
  args:db_name(数据库名称)
  returns:db
 
''' 
def mysql_link(de_name):
  try:
    db = pymysql.connect(host="127.0.0.1", user="xxx",
               passwd="xxx",
               db=xxx,
               charset='utf8')
    return db
  except:
    print("could not connect to mysql server")
 
'''
  读取excel函数
  args:excel_file(excel文件,目录在py文件同目录)
  returns:book
'''
 
 
def open_excel(excel_file):
  try:
    book = xlrd.open_workbook(excel_file) # 文件名,把文件与py文件放在同一目录下
    print(sys.getsizeof(book))
    return book
  except:
    print("open excel file failed!")
 
 
'''
  执行插入操作
  args:db_name(数据库名称)
     table_name(表名称)
     excel_file(excel文件名,把文件与py文件放在同一目录下)
 
'''
 
 
def store_to(db_name, table_name, excel_file):
  db = mysql_link(db_name) # 打开数据库连接
  cursor = db.cursor() # 使用 cursor() 方法创建一个游标对象 cursor
 
  book = open_excel(excel_file) # 打开excel文件
  sheets = book.sheet_names() # 获取所有sheet表名
  for sheet in sheets:
    sh = book.sheet_by_name(sheet) # 打开每一张表
    row_num = sh.nrows
    print(row_num)
    list = [] # 定义列表用来存放数据
    num = 0 # 用来控制每次插入的数量
    for i in range(1, row_num): # 第一行是标题名,对应表中的字段名所以应该从第二行开始,计算机以0开始计数,所以值是1
      row_data = sh.row_values(i) # 按行获取excel的值
      value = (row_data[0], row_data[1], row_data[2], row_data[3], row_data[4], row_data[5], \
           row_data[6], row_data[7], row_data[8], row_data[9], row_data[10], row_data[11], row_data[12],
           row_data[13], row_data[14])
      list.append(value) # 将数据暂存在列表
      num += 1
      if( num>= 10000 ): # 每一万条数据执行一次插入
        print(sys.getsizeof(list))
        sql = "INSERT INTO " + table_name + " (time, xingbie, afdd, xzb, yzb, cfbj, jjlbmc, \
        bjlbmc, bjlxmc, bjlxxlmc, gxqymc,gxdwmc, afql, afxqxx, cjdwmc)\
        VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"
        cursor.executemany(sql, list) # 执行sql语句
 
        num = 0 # 计数归零
        list.clear() # 清空list
        print("worksheets: " + sheet + " has been inserted 10000 datas!")
 
  print("worksheets: " + sheet + " has been inserted " + str(row_num) + " datas!")
  db.commit() # 提交
  cursor.close() # 关闭连接
  db.close() 
 if __name__ == '__main__':
  store_to('demo', 'demo_yangben', 'xxx.xlsx')

思考,如果数据插入有错误,怎么解决,

其实有很多数据库工具可以直接来解决这个问题,注意字符转换的格式就好。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python学习思维导图(必看篇)
Jun 26 Python
python3设计模式之简单工厂模式
Oct 17 Python
Python内置模块turtle绘图详解
Dec 09 Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
Python wxPython库使用wx.ListBox创建列表框示例
Sep 03 Python
Flask之请求钩子的实现
Dec 23 Python
使用Python操作FTP实现上传和下载的方法
Apr 01 Python
Python计算机视觉里的IOU计算实例
Jan 17 Python
django迁移文件migrations的实现
Mar 31 Python
python中matplotlib实现随鼠标滑动自动标注代码
Apr 23 Python
详解python polyscope库的安装和例程
Nov 13 Python
opencv 分类白天与夜景视频的方法
Jun 05 Python
python读取指定字节长度的文本方法
Aug 27 #Python
Django中的cookie和session
Aug 27 #Python
Python3之字节串bytes与字节数组bytearray的使用详解
Aug 27 #Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
Aug 27 #Python
在Python中获取操作系统的进程信息
Aug 27 #Python
python3 下载网络图片代码实例
Aug 27 #Python
Python (Win)readline和tab补全的安装方法
Aug 27 #Python
You might like
PHP 正则表达式之正则处理函数小结(preg_match,preg_match_all,preg_replace,preg_split)
2012/10/05 PHP
php使用反射插入对象示例分享
2014/03/11 PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
2014/07/18 PHP
PHP基于接口技术实现简单的多态应用完整实例
2017/04/26 PHP
Yii框架操作cookie与session的方法实例详解
2019/09/04 PHP
Javascript Function对象扩展之延时执行函数
2010/07/06 Javascript
DWZ table的原生分页浅谈
2013/03/01 Javascript
jquery validate 自定义验证方法介绍 日期验证
2014/02/27 Javascript
js之ActiveX控件使用说明 new ActiveXObject()
2014/03/03 Javascript
href下载文件根据id取url并下载
2014/05/28 Javascript
jQuery实现提交按钮点击后变成正在处理字样并禁止点击的方法
2015/03/24 Javascript
基于OL2实现百度地图ABCD marker的效果
2015/10/01 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
vue.js+element-ui动态配置菜单的实例
2018/09/07 Javascript
js变量声明var使用与不使用的区别详解
2019/01/21 Javascript
javascript数组去重方法总结(推荐)
2019/03/20 Javascript
微信小程序缓存过期时间的使用详情
2019/05/12 Javascript
如何在vue-cli中使用css-loader实现css module
2021/01/07 Vue.js
[39:02]DOTA2亚洲邀请赛 3.31 小组赛 B组 Mineski vs VGJ.T
2018/04/01 DOTA
[14:21]VICI vs EG (BO3)
2018/06/07 DOTA
[01:08:00]Fnatic vs Winstrike 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python fileinput模块使用介绍
2014/11/30 Python
整理Python中的赋值运算符
2015/05/13 Python
Python3爬虫教程之利用Python实现发送天气预报邮件
2018/12/16 Python
在python中利用numpy求解多项式以及多项式拟合的方法
2019/07/03 Python
CSS3 函数技巧 用css 实现js实现的事情(clac Counters Tooltip)
2017/08/15 HTML / CSS
html5与css3小应用
2013/04/03 HTML / CSS
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
学校卫生检查制度
2014/02/03 职场文书
省文明单位申报材料
2014/05/08 职场文书
交通事故委托书范本(2篇)
2014/09/21 职场文书
vue-element-admin项目导入和导出的实现
2021/05/21 Vue.js
MySQL系列之二 多实例配置
2021/07/02 MySQL
Mybatis-plus配置分页插件返回统一结果集
2022/06/21 Java/Android