處理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()