python:excel批量導(dǎo)入數(shù)據(jù)到mysql工具方法

近期批量數(shù)據(jù)對賬,經(jīng)常收到客戶提供的excel要求對數(shù),每次通過excel處理非常不方便在扰,所以想利用python腳本,來幫忙處理雷客,對于大批量數(shù)據(jù)芒珠,從excel導(dǎo)入到mysql數(shù)據(jù)庫處理非常方便,但從文件導(dǎo)入到excel步驟也很多佛纫,比較麻煩妓局,想偷懶,做到拿到excel直接建表入庫數(shù)據(jù)一條龍搞定呈宇,想起來就做好爬,趁周末1個小時左右搞定腳本,基本可以滿足需求甥啄,分享記錄下來存炮。

需求:選擇入庫的excel數(shù)據(jù)文件,指定表名蜈漓,自動建表并將數(shù)據(jù)入庫到表中穆桂。

實現(xiàn):

1、利用python的xlrd庫實現(xiàn)excel文件的操作融虽,mysql的MySQLdb鏈接數(shù)據(jù)庫操作享完;

2、以excel數(shù)據(jù)第1條表頭的字段為庫表名有额,自動創(chuàng)建庫表般又,入庫第1條之后的所有數(shù)據(jù)彼绷,為提高性能,批量插入茴迁。

代碼:

import MySQLdb

import xlrd

import re

import time

import datetime

#這個函數(shù)用來判斷表是否存在

def table_exists(con,table_name):

? ? sql= "show tables;"

? ? con.execute(sql)

? ? tables= [con.fetchall()]

? ? table_list= re.findall('(\'.*?\')',str(tables))

? ? table_list= [re.sub("'",'',each)for eachin table_list]

? ? if table_name in table_list:

? ? ? ? return 1

? ? else:

? ? ? ? return 0


# 創(chuàng)建庫表

def create_table(cur,sheet,table_name):

? ? #判斷表是否存在

? ? if (table_exists(cur, table_name)!= 1):

? ? ? ? print("1--庫表{}不存在寄悯,新建庫表!".format(table_name))

? ? else:

? ? ? ? print("1--庫表{}已存在,刪除重建!".format(table_name))

? ? ? ? cur.execute("drop table if exists {}".format(table_name))

? ? ? ? #exit()

? ? create_table_sql= "create table {}( ".format(table_name)

? ? insert_sql= 'insert into {} ('.format(table_name)

? ? # 拼裝create table語句堕义,取excel第一行做庫表的字段名稱

? ? first_row= sheet.row(0)

? ? for iin range(0, len(first_row)):

? ? ? ? # 剔除表頭中特殊字符猜旬,影響建表語句執(zhí)行

? ? ? ? column_name= first_row[i].value.replace('(', '').replace(')', '').replace('-', '')

? ? ? ? if i== len(first_row)- 1:

? ? ? ? ? ? create_table_sql= create_table_sql+ "{} varchar(255) )".format(column_name)

? ? ? ? ? ? insert_sql= insert_sql+ '{} )'.format(column_name)

? ? ? ? else:

? ? ? ? ? ? create_table_sql= create_table_sql+ "{} varchar(255) ,".format(column_name)

? ? ? ? ? ? insert_sql= insert_sql+ '{} ,'.format(column_name)

? ? cur.execute(create_table_sql)

? ? print('2--表已創(chuàng)建成功!')

? ? return insert_sql+" values"


# 批量插入數(shù)據(jù)到庫表中

def insert_table(cur, sheet, table_name,insert_sql):

? ? print('3--待入庫記錄總數(shù):',sheet.nrows-1)

? ? begintime= datetime.datetime.now()

? ? # 取列表數(shù)據(jù),從第1行開始倦卖,0行作為表字段名

? ? sql_values= ' '

? ? for iin range(1,sheet.nrows):

? ? ? ? sql_values+=? '( '

? ? ? ? #得到行數(shù)據(jù)

? ? ? ? row_values= sheet.row_values(i)

? ? ? ? for jin range(len(row_values)):

? ? ? ? ? ? ctype= sheet.cell(i,j).ctype

? ? ? ? ? ? value= sheet.cell(i,j).value

? ? ? ? ? ? #類型如果為數(shù)字洒擦,則變?yōu)檎危駝t會有.0情況

? ? ? ? ? ? if ctype==2 and value% 1==0:

? ? ? ? ? ? ? ? value= int(value)

? ? ? ? ? ? if j== len(row_values)-1:

? ? ? ? ? ? ? ? #str += row_values[j]

? ? ? ? ? ? ? ? sql_values+= "'"+str(value)+"'"+')'

? ? ? ? ? ? else:

? ? ? ? ? ? ? ? sql_values+= "'"+str(value)+"'"+','

? ? ? ? if i== sheet.nrows-1:

? ? ? ? ? ? sql_values+= ''

? ? ? ? else:

? ? ? ? ? ? sql_values+= ','

? ? # 獲取拼裝后的批量sql

? ? exec_sql= insert_sql + sql_values

? ? cur.execute(exec_sql)

? ? endtime= datetime.datetime.now()

? ? print('4--入庫成功記錄總數(shù):',sheet.nrows-1,',消耗時間:',(endtime-begintime).seconds)


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

def importToMysql(import_file,table_name):

? ? # 連接數(shù)據(jù)庫糖耸,查詢數(shù)據(jù)

? ? db= MySQLdb.connect(host="127.0.0.1", port=3306, user="root", passwd="root", db="test",charset='GBK')

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

? ? cur= db.cursor()

? ? book= xlrd.open_workbook(import_file)

? ? sheet= book.sheet_by_index(0)

? ? if sheet.nrows>0:

? ? ? ? # 創(chuàng)建庫表

? ? ? ? insert_sql= create_table(cur, sheet, table_name)

? ? ? ? #插入數(shù)據(jù)

? ? ? ? insert_table(cur, sheet, table_name, insert_sql)

? ? else:

? ? ? ? print('文件為空秘遏,無需導(dǎo)入')

? ? cur.close()

? ? db.commit()

? ? db.close()

if __name__== '__main__':

? ? importToMysql("test.xlsx",'test4')


執(zhí)行測試,結(jié)果如下:

2.8萬數(shù)據(jù)嘉竟,入庫執(zhí)行9秒邦危,速度算比較快了。

后期不用繁瑣的到mysql建表舍扰、執(zhí)行導(dǎo)入等操作了倦蚪,直接運行腳本、指定表名边苹,一鍵搞定陵且,知識就是生產(chǎn)力。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末个束,一起剝皮案震驚了整個濱河市慕购,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌茬底,老刑警劉巖沪悲,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異阱表,居然都是意外死亡殿如,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門最爬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來涉馁,“玉大人,你說我怎么就攤上這事爱致】舅停” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵糠悯,是天一觀的道長帮坚。 經(jīng)常有香客問我牢裳,道長,這世上最難降的妖魔是什么叶沛? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮忘朝,結(jié)果婚禮上灰署,老公的妹妹穿的比我還像新娘。我一直安慰自己局嘁,他們只是感情好溉箕,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悦昵,像睡著了一般肴茄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上但指,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天寡痰,我揣著相機與錄音,去河邊找鬼棋凳。 笑死拦坠,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剩岳。 我是一名探鬼主播贞滨,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拍棕!你這毒婦竟也來了晓铆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤绰播,失蹤者是張志新(化名)和其女友劉穎骄噪,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幅垮,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡腰池,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了忙芒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片示弓。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖呵萨,靈堂內(nèi)的尸體忽然破棺而出奏属,到底是詐尸還是另有隱情,我是刑警寧澤潮峦,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布囱皿,位于F島的核電站勇婴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嘱腥。R本人自食惡果不足惜耕渴,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望齿兔。 院中可真熱鬧橱脸,春花似錦、人聲如沸分苇。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽医寿。三九已至栏赴,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間靖秩,已是汗流浹背须眷。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留盆偿,地道東北人柒爸。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像事扭,于是被迫代替她去往敵國和親捎稚。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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

  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,446評論 0 13
  • ORACLE自學(xué)教程 --create tabletestone ( id number, --序號usernam...
    落葉寂聊閱讀 1,066評論 0 0
  • 數(shù)據(jù)庫編程概述求橄、pymysql基本操作方法總結(jié)今野、參數(shù)化列表防止SQL注入總結(jié) 2.6 Python數(shù)據(jù)庫編程 學(xué)習(xí)...
    Cestine閱讀 1,497評論 0 2
  • 什么是數(shù)據(jù)庫? 數(shù)據(jù)庫是存儲數(shù)據(jù)的集合的單獨的應(yīng)用程序罐农。每個數(shù)據(jù)庫具有一個或多個不同的API条霜,用于創(chuàng)建,訪問涵亏,管理...
    chen_000閱讀 4,030評論 0 19
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,795評論 0 11