PY3 批量導(dǎo)入EXCEL到數(shù)據(jù)庫腳本模板

1啰劲、支持分批導(dǎo)入(可配置)

2、批量導(dǎo)入降低數(shù)據(jù)庫操作

3鲸睛、批量數(shù)據(jù)錯誤會自動重新生成導(dǎo)入數(shù)據(jù)最終只剩下錯誤數(shù)據(jù)昨寞,保證數(shù)據(jù)正確率和打入率最大化

CODE:

? ??


#!/usr/bin/python3

import xlrd

import pymysql

import os

import json

dataHost = ""

dataUser = ""

dataPwd? = ""

dataName = "test"

#錯誤數(shù)據(jù)文件存儲位置

errorFile = "./errorFile.json"

#導(dǎo)入數(shù)據(jù)源

excelFile = "./jb.xlsx"

#一次允許灌入數(shù)據(jù)庫數(shù)據(jù)的條數(shù)

onceInsertNum = 5

#一次允許灌入數(shù)據(jù)庫的原始數(shù)據(jù)

dataList = []

#一次允許最多讀入EXCEL數(shù)據(jù)條數(shù)

onceReadExcelNum = 10

# 打開數(shù)據(jù)庫連接

print("連接數(shù)據(jù)庫.......")

db = pymysql.connect(dataHost,dataUser,dataPwd,dataName)

print("數(shù)據(jù)庫連接成功!")

'''

? ? 將數(shù)據(jù)灌入數(shù)據(jù)庫

'''

def insertDbData(params=[], onceInsertNums=20):

? ? lens = len(params)

? ? if lens < 1:

? ? ? ? print("無插入數(shù)據(jù)")

? ? ? ? return

? ? if int(lens / onceInsertNums) * onceInsertNums == lens:

? ? ? ? tempLens = int(lens / onceInsertNums)

? ? else:

? ? ? ? tempLens = int((lens / onceInsertNums) + 1)

? ? for i in range(tempLens):

? ? ? ? dataList.clear()

? ? ? ? # SQL 插入語句


? ? ? ? jnums = onceInsertNums

? ? ? ? if i == tempLens - 1:

? ? ? ? ? ? if tempLens * onceInsertNums != lens:

? ? ? ? ? ? ? ? jnums = lens % onceInsertNums


? ? ? ? for j in range(i*onceInsertNums, i*onceInsertNums+jnums):

? ? ? ? ? ? dataList.append(params[j])

? ? ? ? sqlLists = getSqlLists(dataList)

? ? ? ? insertData(sqlLists)

def getSqlLists(params=[]):

? ? sql = "INSERT INTO test(bh,ptdjr,gcrxm,khjl,jsyxm,bjscjc,cph,dgjc,bz) VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s) "

? ? lists = []

? ? # for i in params:

? ? #? ? sql += str(tuple(i)) + ","

? ? # sql = sql.strip(',')

? ? # sql += ";"

? ? for i in params:

? ? ? ? lists.append(tuple(i))

? ? return [[sql, lists]]

def insertData(sqlLists):

? ? # 使用cursor()方法獲取操作游標(biāo)

? ? cursor = db.cursor()

? ? try:

? ? ? ? print("開始操作數(shù)據(jù)庫.....")

? ? ? ? for sql in sqlLists:

? ? ? ? ? ? print(sql[0])

? ? ? ? ? ? print(sql[1])

? ? ? ? ? ? # 執(zhí)行sql語句

? ? ? ? ? ? cursor.executemany(sql[0], sql[1])

? ? ? ? db.commit()

? ? ? ? print("提交數(shù)據(jù)成功!")

? ? ? ? # results = cursor.fetchall()

? ? ? ? # print(results)

? ? except:

? ? ? ? # 發(fā)生錯誤時回滾

? ? ? ? db.rollback()

? ? ? ? print("插入失敗=>數(shù)據(jù)回滾中")

? ? ? ? writeFiles(errorFile ,dataList)

#獲取EXCEL數(shù)據(jù)

def redDataFormExcel(fileName):

? ? dontReadRows = [0,1]

? ? dontReadCols = []

? ? # 打開execl

? ? workbook = xlrd.open_workbook(fileName)

? ? # 根據(jù)sheet索引或者名稱獲取sheet內(nèi)容

? ? Data_sheet = workbook.sheets()[0]? # 通過索引獲取

? ? # Data_sheet = workbook.sheet_by_index(0)? # 通過索引獲取

? ? # Data_sheet = workbook.sheet_by_name(u'Sheet2')? # 通過名稱獲取

? ? rowNum = Data_sheet.nrows? # sheet行數(shù)

? ? colNum = Data_sheet.ncols? # sheet列數(shù)

? ? print("行數(shù):" + str(rowNum))

? ? print("列數(shù):" + str(colNum))

? ? if int(rowNum / onceReadExcelNum) * onceReadExcelNum == rowNum:

? ? ? ? tempRowNum = int(rowNum / onceReadExcelNum)

? ? else:

? ? ? ? tempRowNum = int(rowNum / onceReadExcelNum) + 1

? ? iCnt = 0

? ? lists = []

? ? rowlist = []

? ? while iCnt < tempRowNum:

? ? ? ? print("-----------------------------開始讀取數(shù)據(jù)---------------------------")

? ? ? ? getRowNum = onceReadExcelNum

? ? ? ? if iCnt == tempRowNum - 1:

? ? ? ? ? ? if tempRowNum * onceReadExcelNum != rowNum:

? ? ? ? ? ? ? ? getRowNum = rowNum % onceReadExcelNum

? ? ? ? lists.clear()

? ? ? ? rowListIndex = list(range(iCnt * onceReadExcelNum, iCnt * onceReadExcelNum + getRowNum))

? ? ? ? colListIndex = list(range(colNum))

? ? ? ? for i in dontReadCols:

? ? ? ? ? ? if i in colListIndex:

? ? ? ? ? ? ? ? colListIndex.remove(i)

? ? ? ? for i in dontReadRows:

? ? ? ? ? ? if i in rowListIndex:

? ? ? ? ? ? ? ? rowListIndex.remove(i)

? ? ? ? for i in rowListIndex:

? ? ? ? ? ? rowlist = []

? ? ? ? ? ? for j in colListIndex:

? ? ? ? ? ? ? ? rowlist.append(Data_sheet.cell_value(i, j))

? ? ? ? ? ? lists.append(rowlist)

? ? ? ? print("--------------------------------讀取完成-----------------------------")

? ? ? ? insertDbData(lists, onceInsertNum)

? ? ? ? iCnt += 1

? ? # 輸出所有單元格的內(nèi)容

? ? # print(list)

? ? # os._exit(0)

? ? # for i in lists:

? ? #? ? for j in i:

? ? #? ? ? ? print(j, '\t\t', end="")

? ? #? ? print()

? ? # 獲取整行和整列的值(列表)

? ? # rows = Data_sheet.row_values(0)? # 獲取第一行內(nèi)容

? ? # cols = Data_sheet.col_values(1)? # 獲取第二列內(nèi)容

? ? # print (rows)

? ? # print (cols)

? ? # os._exit(0)

? ? # 獲取單元格內(nèi)容

? ? # cell_A1 = Data_sheet.cell(0, 0).value

? ? # cell_B1 = Data_sheet.row(0)[1].value? # 使用行索引

? ? # cell_C1 = Data_sheet.cell(0, 2).value

? ? # cell_D2 = Data_sheet.col(3)[1].value? # 使用列索引

? ? # print(cell_A1, cell_B1, cell_C1, cell_D2)

? ? # os._exit(0);

? ? # 獲取單元格內(nèi)容的數(shù)據(jù)類型

? ? # ctype:0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error

? ? # print('cell(0,0)數(shù)據(jù)類型:', Data_sheet.cell(0, 2).ctype)

? ? # print('cell(1,0)數(shù)據(jù)類型:', Data_sheet.cell(1, 0).ctype)

? ? # print('cell(5,1)數(shù)據(jù)類型:', Data_sheet.cell(5, 1).ctype)

? ? # print('cell(1,2)數(shù)據(jù)類型:', Data_sheet.cell(1, 2).ctype)

? ? # os._exit(0)

? ? # 獲取單元格內(nèi)容為日期的數(shù)據(jù)

? ? # date_value = xlrd.xldate_as_tuple(Data_sheet.cell_value(1,0),workbook.datemode)

? ? # print(type(date_value), date_value)

? ? # print('%d:%d:%d' % (date_value[0:3]))

#寫入文件

def writeFiles(fileName, data):

? ? file = open(fileName, "a+", encoding="utf8")

? ? for i in data:

? ? ? ? temp = i

? ? ? ? if isinstance(i, list):

? ? ? ? ? ? temp = json.dumps(i,ensure_ascii=False)

? ? ? ? file.write(temp+"\n")

? ? file.close()

? ? print("失敗數(shù)據(jù)寫入文件成功")


def readErrorFile():

? ? if not os.path.exists(errorFile):

? ? ? ? return

? ? booles = False

? ? tempIcnt = onceInsertNum

? ? while True:

? ? ? ? if not booles:

? ? ? ? ? ? file = open(errorFile, 'r+', encoding='utf8')

? ? ? ? ? ? lines = file.readlines()

? ? ? ? ? ? file.seek(0)

? ? ? ? ? ? file.truncate()

? ? ? ? ? ? file.close()

? ? ? ? ? ? tempDataList = []

? ? ? ? ? ? for i in lines:

? ? ? ? ? ? ? ? tempDataList.append(json.loads(i.strip()))

? ? ? ? ? ? iCnt = int(tempIcnt / 2)

? ? ? ? ? ? tempIcnt = iCnt

? ? ? ? ? ? if iCnt == 0:

? ? ? ? ? ? ? ? iCnt = 1

? ? ? ? ? ? if iCnt == 1:

? ? ? ? ? ? ? ? booles = True

? ? ? ? ? ? insertDbData(tempDataList, iCnt)

? ? ? ? else:

? ? ? ? ? ? break

if __name__ == '__main__':

? ? redDataFormExcel(excelFile)

? ? readErrorFile()

? ? #關(guān)閉數(shù)據(jù)庫

? ? db.close()

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末括袒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锹锰,更是在濱河造成了極大的恐慌,老刑警劉巖恃慧,帶你破解...
    沈念sama閱讀 223,126評論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異痢士,居然都是意外死亡,警方通過查閱死者的電腦和手機良瞧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評論 3 400
  • 文/潘曉璐 我一進店門陪汽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來褥蚯,“玉大人,你說我怎么就攤上這事训挡∑缜浚” “怎么了?”我有些...
    開封第一講書人閱讀 169,941評論 0 366
  • 文/不壞的土叔 我叫張陵肤京,是天一觀的道長忘分。 經(jīng)常有香客問我白修,道長,這世上最難降的妖魔是什么肯骇? 我笑而不...
    開封第一講書人閱讀 60,294評論 1 300
  • 正文 為了忘掉前任笛丙,我火速辦了婚禮,結(jié)果婚禮上符相,老公的妹妹穿的比我還像新娘蠢琳。我一直安慰自己傲须,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,295評論 6 398
  • 文/花漫 我一把揭開白布例衍。 她就那樣靜靜地躺著已卸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪梦抢。 梳的紋絲不亂的頭發(fā)上愧哟,一...
    開封第一講書人閱讀 52,874評論 1 314
  • 那天蕊梧,我揣著相機與錄音,去河邊找鬼端衰。 笑死橄抹,一個胖子當(dāng)著我的面吹牛楼誓,可吹牛的內(nèi)容都是我干的名挥。 我是一名探鬼主播,決...
    沈念sama閱讀 41,285評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼参淫,長吁一口氣:“原來是場噩夢啊……” “哼愧杯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起耍铜,我...
    開封第一講書人閱讀 40,249評論 0 277
  • 序言:老撾萬榮一對情侶失蹤棕兼,失蹤者是張志新(化名)和其女友劉穎抵乓,沒想到半個月后灾炭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,760評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡田弥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,840評論 3 343
  • 正文 我和宋清朗相戀三年皱蹦,在試婚紗的時候發(fā)現(xiàn)自己被綠了沪哺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酌儒。...
    茶點故事閱讀 40,973評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡忌怎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出孽惰,到底是詐尸還是另有隱情鸥印,我是刑警寧澤坦报,帶...
    沈念sama閱讀 36,631評論 5 351
  • 正文 年R本政府宣布片择,位于F島的核電站字管,受9級特大地震影響信不,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜借跪,卻給世界環(huán)境...
    茶點故事閱讀 42,315評論 3 336
  • 文/蒙蒙 一掏愁、第九天 我趴在偏房一處隱蔽的房頂上張望卵牍。 院中可真熱鬧,春花似錦辛掠、人聲如沸释牺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牌捷。三九已至涡驮,卻和暖如春捉捅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背即碗。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評論 1 275
  • 我被黑心中介騙來泰國打工剥懒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留合敦,地道東北人。 一個月前我還...
    沈念sama閱讀 49,431評論 3 379
  • 正文 我出身青樓保檐,卻偏偏與公主長得像夜只,于是被迫代替她去往敵國和親蒜魄。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,982評論 2 361

推薦閱讀更多精彩內(nèi)容

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,466評論 0 13
  • 本文以Loadrunner的Java_Vuser腳本為例伞鲫,來做一個簡化版的自動化測試框架(以excel作為數(shù)據(jù)驅(qū)動...
    smooth00閱讀 517評論 0 0
  • 1.13感恩日記 感恩今天是周末,我可以去街上采購好多孩子們愛吃的食材柒瓣,給他們做可口的飯菜吠架。 感恩兒子乖巧懂事诵肛,我...
    種子高手閱讀 225評論 0 0
  • 今天拿出早已買好的吳軍老師的書《見識》,買下來很長一段時間了褪秀,可是卻一直擱置沒有打開薛训。想著最近自己實在寫不...
    開往春天的綠蘿閱讀 179評論 1 1
  • 1乙埃、實際預(yù)測過程中锯岖,一般都把未戍土當(dāng)火論甫何、辰丑土當(dāng)水論就行了辙喂。 2、雖然看起來辰戍丑未很復(fù)雜巍耗,實際預(yù)測時炬太,只需明白...
    Forin_閱讀 804評論 0 0