使用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开发的nosql数据库CodernityDB介绍和使用实例
Oct 23 Python
讲解Python中for循环下的索引变量的作用域
Apr 15 Python
python对html代码进行escape编码的方法
May 04 Python
Python单链表简单实现代码
Apr 27 Python
Python中表示字符串的三种方法
Sep 06 Python
Python编程求质数实例代码
Jan 31 Python
django框架自定义用户表操作示例
Aug 07 Python
selenium+python自动化测试之使用webdriver操作浏览器的方法
Jan 23 Python
微信小程序python用户认证的实现
Jul 29 Python
解决Jupyter因卸载重装导致的问题修复
Apr 10 Python
Python判断字符串是否为合法标示符操作
Sep 03 Python
Python find()、rfind()方法及作用
Dec 24 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
比较strtr, str_replace和preg_replace三个函数的效率
2013/06/26 PHP
php实现mysql数据库操作类分享
2014/02/14 PHP
详解WordPress中给链接添加查询字符串的方法
2015/12/18 PHP
PHP支付系统设计与典型案例分享
2016/08/02 PHP
php数据序列化测试实例详解
2017/08/12 PHP
将HTML自动转为JS代码
2006/06/26 Javascript
jquery 常用操作整理 基础入门篇
2009/10/14 Javascript
drag-and-drop实现图片浏览器预览
2015/08/06 Javascript
angularjs表格ng-table使用备忘录
2016/03/09 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
Bootstrap分页插件之Bootstrap Paginator实例详解
2016/10/15 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
vue awesome swiper异步加载数据出现的bug问题
2018/07/03 Javascript
Vue.set() this.$set()引发的视图更新思考及注意事项
2018/08/30 Javascript
js实现全选和全不选
2020/07/28 Javascript
javascript实现下拉菜单效果
2021/02/09 Javascript
python比较2个xml内容的方法
2015/05/11 Python
漂亮的Django Markdown富文本app插件的实现
2019/01/02 Python
python解析含有重复key的json方法
2019/01/22 Python
Python3数字求和的实例
2019/02/19 Python
python 实现方阵的对角线遍历示例
2019/11/29 Python
Python使用GitPython操作Git版本库的方法
2020/02/29 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
is_file和file_exists效率比较
2021/03/14 PHP
Css3实现无缝滚动防抖
2020/09/14 HTML / CSS
世界上最大的汽车共享网站:Zipcar
2017/01/14 全球购物
北美三大旅游网站之一:Travelocity
2017/08/12 全球购物
傲盾软件面试题
2015/08/17 面试题
介绍一下JMS编程步骤
2015/09/22 面试题
自荐信封面
2013/12/04 职场文书
大学生党员自我评价范文
2014/04/09 职场文书
教师学习八项规定六项禁令思想汇报
2014/09/27 职场文书
2015年教务工作总结
2015/05/23 职场文书
详解Python中下划线的5种含义
2021/07/15 Python
日本官方排名前10的动漫,名侦探柯南上榜,第一是一部创造历史的动漫
2022/03/18 日漫
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android