使用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代码检查工具pylint 让你的python更规范
Sep 05 Python
详解Python中的正则表达式的用法
Apr 09 Python
使用django-crontab实现定时任务的示例
Feb 26 Python
在CMD命令行中运行python脚本的方法
May 12 Python
windows下python 3.6.4安装配置图文教程
Aug 21 Python
详解Python安装tesserocr遇到的各种问题及解决办法
Mar 07 Python
详解python多线程之间的同步(一)
Apr 03 Python
详解Django定时任务模块设计与实践
Jul 24 Python
Python实现一个带权无回置随机抽选函数的方法
Jul 24 Python
解决Keyerror ''acc'' KeyError: ''val_acc''问题
Jun 18 Python
Python用SSH连接到网络设备
Feb 18 Python
Python 如何实现文件自动去重
Jun 02 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数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
2011/10/31 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
laravel 解决Validator使用中出现的问题
2019/10/25 PHP
js 数组操作代码集锦
2009/04/28 Javascript
Three.js源码阅读笔记(Object3D类)
2012/12/27 Javascript
js中的异常处理try...catch使用介绍
2013/09/21 Javascript
用jquery等比例控制图片宽高的具体实现
2014/01/28 Javascript
JavaScript匿名函数用法分析
2015/02/13 Javascript
简介JavaScript中Boolean.toSource()方法的使用
2015/06/05 Javascript
js实现超酷的照片墙展示效果图附源码下载
2015/10/08 Javascript
vuejs如何配置less
2017/04/25 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
实现一个 Vue 吸顶锚点组件方法
2019/07/10 Javascript
微信小程序工具函数封装
2019/10/28 Javascript
JavaScript的一些小技巧分享
2021/01/06 Javascript
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
python输出当前目录下index.html文件路径的方法
2015/04/28 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
python爬虫 爬取58同城上所有城市的租房信息详解
2019/07/30 Python
深入了解Python在HDA中的应用
2019/09/05 Python
简单了解python中的与或非运算
2019/09/18 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
HTML5 3D衣服摇摆动画特效
2016/03/17 HTML / CSS
德国EGOIST网店:销售畅销的设计师品牌
2017/04/18 全球购物
Exoticca英国:以最优惠的价格提供豪华异国情调旅行
2018/10/18 全球购物
研究生求职推荐信范文
2013/11/30 职场文书
企业晚会策划方案
2014/05/29 职场文书
社会学专业求职信
2014/07/17 职场文书
感恩教师节演讲稿
2014/09/03 职场文书
2014离婚协议书范文两篇
2014/09/15 职场文书
2014年检验员工作总结
2014/11/19 职场文书
大学生预备党员自我评价
2015/03/04 职场文书
检举信的写法
2019/04/10 职场文书
Python selenium的这三种等待方式一定要会!
2021/06/10 Python