python讀excel寫入mysql小工具

背景

須要導入全國高校名錄到數據庫,從教委網站下到了最新的數據,是excel格式,須要作一個工具進行導入,想試用一下python,說幹就幹。python

  • xlrd : excel讀寫庫mysql

  • pymysql : mysql數據庫驅動庫,純python打造linux

  • re : 正則表達式庫,核心庫正則表達式

前兩個用pip輕鬆完成安裝,本人是在mac pro是進行的,過程很順利,之前在mac上裝mysqlclient一直安裝不上,因此一度放棄使用python,但我在linux下安裝mysqlclient卻沒有任何問題。sql

源代碼

很簡單的小腳本,留存記念。值得注意的一點,數據庫鏈接字段串中要設定字符編碼,否則默認是lanti-1,寫入會出錯。數據庫

import xlrd
import pymysql
import re

conn = pymysql.connect(host='database connect address', port=1234, user='root',
                       passwd='****', db='database name', charset='utf8mb4')
p = re.compile(r'\s')
data = xlrd.open_workbook('./W020170616379651135432.xls')
table = data.sheets()[0]
t = table.col_values(1)
nrows = table.nrows
for i in range(nrows):
    r1 = table.row_values(i)
    if len(r1[2]) == 10:
        cur = conn.cursor()
        cur.execute('insert into `university` (`id`, `name`, `ministry`, `city`, `level`, `memo`) \
                    values (%s, %s, %s, %s, %s, %s)',
                    (r1[2], p.sub('', r1[1]), p.sub('', r1[3]), p.sub('', r1[4]), r1[5], r1[6]))
        conn.commit()
        cur.close()

conn.close()

心得

寫慣了類C的語言,不太習慣python,想同時掌握兩種風格的編程語言,好痛苦啊。python編程效率的確不錯,這是我第一次用python寫實用小程序,連查帶寫帶調試,一共也就花了一個來小時。python庫與資料豐富,不愁找不到合適的^_^編程

數據庫寫入優化

早上閒來無事,用批量寫入優化了一下,任務秒完成,比一條條寫入快了不少, 比我預想的差異還要大。看來,沒有很差的工具,只是咱們沒有用好啊!小程序

import xlrd
import pymysql
import re

conn = pymysql.connect(host='database connect address', port=1234, user='root',
                       passwd='****', db='database name', charset='utf8mb4')
p = re.compile(r'\s')
data = xlrd.open_workbook('./W020170616379651135432.xls')
table = data.sheets()[0]
t = table.col_values(1)
nrows = table.nrows
ops = []
for i in range(nrows):
    r1 = table.row_values(i)
    if len(r1[2]) == 10:
        ops.append((r1[2], p.sub('', r1[1]), p.sub('', r1[3]), p.sub('', r1[4]), r1[5], r1[6]))

cur = conn.cursor()
cur.executemany('insert into `university_copy` (`id`, `name`, `ministry`, `city`, `level`, `memo`) \
                 values (%s, %s, %s, %s, %s, %s)', ops)
conn.commit()
cur.close()

conn.close()
相關文章
相關標籤/搜索