使用python從excel批量導入數據到mysql數據庫

處理excel推薦使用 openpyxl ,不推薦xlrd和xlwt,因爲後兩者對xlsx支持非常差勁,並且一個能讀不能寫,一個能寫不能修改,也就是說想要修改一個xls是很繁瑣的。

連MySQL數據庫使用PyMySQL比較容易操作,本文導入的數據是幾十個excel文件,分佈於某個目錄下的若干子目錄下,每個文件十幾M到幾十M之間。

import pymysql.cursors #用來操作數據庫  參考地址: https://pypi.org/project/PyMySQL/#downloads 如果報錯請按照這個鏈接安裝 pip3 install PyMySQL
#import xlrd # 用來讀excel 參考地址: https://www.cnblogs.com/MrLJC/p/3715783.html
from openpyxl import load_workbook # 可以支持xlsx的工具,https://www.cnblogs.com/anpengapple/p/6399304.html?utm_source=itdadao&utm_medium=referral 
import os # 用來度文件 參考地址: https://www.cnblogs.com/mufenglin/p/7676160.html
import re # 正則表達式模塊  參考地址: http://www.runoob.com/python/python-reg-expressions.html

# 連接數據庫
connection = pymysql.connect(host='localhost', # 數據庫地址
                             user='root',       # 數據庫用戶名
                             password='root',# 數據庫密碼
                             db='article',         # 數據庫名稱
                             charset='utf8mb4',
                             cursorclass=pymysql.cursors.DictCursor)

cursor = connection.cursor()

# 創建數據庫
tablename = 'article'        
sql = "CREATE TABLE `"+tablename+"` (`pmid` int(11) NOT NULL,`article_title` varchar(1024) DEFAULT NULL,`author_list` varchar(1024) DEFAULT NULL,`abstract_text` text DEFAULT NULL,`keywords` varchar(1025) DEFAULT NULL,`pmcid` char(255) DEFAULT NULL,`pub_med_pub_date` char(255) DEFAULT NULL,`journal_issue` char(255) DEFAULT NULL,`serch_text` char(255) DEFAULT NULL) ENGINE=MyISAM DEFAULT CHARSET=utf8"
cursor.execute("DROP TABLE IF EXISTS `"+tablename+"`")
cursor.execute(sql)
connection.commit()
count=0
# 遍歷目錄
basedir = './'
rootdir = os.listdir(basedir)
for subdir in rootdir: # 遍歷第一層目錄 1 2 3 4 5 6
    if os.path.isdir(subdir):
        subrootdir = os.listdir(basedir+subdir)
        for files in subrootdir: # 遍歷第二層目錄 如 1下面的目錄 
            # print(os.path.splitext(files)[1])
            if os.path.splitext(files)[1]=='.xlsx': # 如果是excel文件
                # data = xlrd.open_workbook(basedir+subdir+'/'+files)
                # table = data.sheets()[0]
                wb = load_workbook(basedir+subdir+'/'+files)
                table = wb.get_sheet_by_name("Sheet1")
                print("導入",basedir+subdir+'/'+files,"數據中,已經導入",count,"條數據")
                ##### 下面的方法是一個excel運行一次插入語句,經驗證太慢,一個excel導入耗時超過3分鐘
                # thissql = 'insert into '+tablename+' values '
                # for row in range(1,table.nrows):
                #     value = '('
                #     for col in range(0,9):
                #         value += "'"+str(table.cell(row,col).value)+"',"
                #     value = value[:(len(value)-1)]+"),"
                #     thissql +=value                
                # thissql = thissql[:(len(thissql))]
                # cursor.execute(thissql)
                # connection.commit()

                ##### 下面的方法是一行運行一次插入語句
                thissql = 'insert into '+tablename+' values(%s,%s,%s,%s,%s,%s,%s,%s,%s)'
                for row in range(2,table.max_row):
                    cursor.execute(thissql,(#table.cell(row=row,column=0),
                    table.cell(row=row,column=1).value,
                    table.cell(row=row,column=2).value,
                    table.cell(row=row,column=3).value,
                    table.cell(row=row,column=4).value,
                    table.cell(row=row,column=5).value,
                    table.cell(row=row,column=6).value,
                    table.cell(row=row,column=7).value,
                    table.cell(row=row,column=8).value,table.cell(row=row,column=9).value,))
                    count+=1
                connection.commit()

print('批量導入數據完畢,共導入:',count,'條數據')                
# 關閉數據庫
connection.close()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章