利用python將excel數據導入mySQL


主要用到的庫有xlrdpymysql, 注意pymysql不支持python3

篇幅有限,只針對主要操作進行說明

連接數據庫

首先pymysql需要連接數據庫,我這里連接的是本地數據庫(數據庫叫lds714610)。

conn = connect( host='localhost', port=3306, database='lds714610',
  user='root', charset='utf8')

# 主要通過cursor來對數據庫進行查詢,插入等一系列操作
cursor = conn.cursor()

#在操作完所有操作后,提交修改,退出數據庫
conn.commit()
conn.close()

從excel中讀取數據

導入數據之前,需要先讀取excel中的數據。

通過xlrd庫讀取到excel表的數據,返回的數據類型很單一,幾乎都是字符類型。所以excel表格中的空也是用""表示的,而不是null或None。

# excel文件
# 第一步打開excel文件,類似普通的文件open操作。注意open_workbook的參數必須是unicode編碼
book = open_workbook(fileName[i].decode('utf-8'))

# 表格
# 一個excel文件中可能有多個表,可以通過sheets()方法返回關於所有表格的list列表
sheet = book.sheets()[0]	#通過下標可以獲取某一個表格

# 行 (元組)
# 下面獲取一個表格內特定行的特定列的值
sheet.cell_value(i,j)	#表格獲取i行j列的值,一般會使用strip()去掉空格

# sheet有很多關於表格的屬性
tolRows = sheet.nrows	#表格的總行數

向pymysql中寫入數據

之后說過對於pymysql通過cursor對數據庫進行讀寫。

對於庫pymysql,程序從中讀取到的數據類型可能是string、float、datetime等。同時也是使用None表示數據庫中的空值,pymysql中 insert into的value如果是空字串"",不會對應mySQL中的NONE,而是同樣表示一個空字串。

# 查詢
cursor.execute("select TID from Train where TName = %s", TName)

# 獲取查詢結果,fetchall的結果是一個元組,它的每個元素也是元組,並且元素對應select的一個查詢結果
# 如rows 可能是 ( (123,), (124,), (125,) ) 這種形式
rows = cursor.fetchall()
  for r in rows:
    print(r[0])		#輸出TID
# fetchall(self):接收全部的返回結果行.
# fetchone(self):返回一條結果行.
# fetchmany(self, size=None):接收size條返回結果行
    
# 插入多行,rows可能包含多組[TID], 但通過executemany可以用一條語句插入全部
# 注意使用executemany向Mysql插入數據時,一律使用%s格式,即使插入的數據是數值, here %s is NOT formatter, but is a placeholder
cursor.executemany(“ insert into Train(TID) values(%s) ”, rows)

處理時間數據

使用的庫是datetimexlrd

首先處理excel中的時間類型數據。在使用xlrd讀取Excel表格中的日期格式時,讀出的內容和原來Excel表格中的內容不一致。讀取出來的是一個浮點數。導致不能正確使用。

而xldate_as_tuple方法可以很好地解決這個問題。獲取excel中的時間數據使用xlrd的xldate_as_tuple方法。

from xlrd import xldate_as_tuple

# 參數一:要處理的單元格值
# 參數二:時間基准(0代表以1900-01-01為基准,1代表以1904-01-01為基准)
# return (year, month, day, hour, minute, nearest_second)
STime = xldate_as_tuple( sheet.cell_value(i,3), 0 )

datetime的數據格式

import datetime

#字符串轉datetime
nowDateTime = datetime.datetime.strptime('2020-4-30', "%Y-%m-%d")

# 直接指定年月日時分秒
nowDateTime = datetime.datetime(2020, 4, 30, 0, 0, 0)

#datetime轉字符串
nowDateTime.strftime("%Y-%m-%d %H:%M:%S")

# 獲取當前時間
today = datetime.datetime.now()

%Y-%m-%d %H:%M:%S 是datetime類型數據的一般格式,可以使用nowDateTime.date()方法去掉時分秒,但是得到的是datetime.date類型的數據,格式為 %Y-%m-%d

因此如果要將datetime中的時分秒清0,方法是先將其轉為“%Y-%m-%d”格式的字符串,再將字符串轉為datetime類型數據。

時間類型的計算

datetime類型可以很方便的進行時間上的運行,如計算1天后、10天前、5分鍾后或1小時前的年月日時分秒。

# 計算5分鍾后的時間
after5Min = nowDateTime + timedelta( minutes = 5 )
# 以此類推timedelta的形參還有days, hours等等

注意nowDateTime.date() + timedelta( minutes = 5 ) 的結果里,時分秒一直是0,因為它是date類型。

關於xlrd的例子 : https://xlrd.readthedocs.io/en/stable/api.html#xlrd-sheet
https://www.cnblogs.com/insane-Mr-Li/p/9092619.html
關於pymysql的例子 : https://www.cnblogs.com/huiyichanmian/p/11228192.html

我的github有一個詳細例子,歡迎去fork或start (里面有相關的excel文件和python文件)https://github.com/dslu7733/mysql_exercise/blob/master/lab/%E6%95%B0%E6%8D%AE%E5%BA%93%E4%BB%BF%E7%9C%9F%E6%95%B0%E6%8D%AE%E5%AF%BC%E5%85%A5/importData.py


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM