Python元組(Tuple)的使用非常有效,尤其是在大批量數據插入數據庫的情況下,非常高效,直接上案例
1.序言
元組(Tuple)一旦定義,就不可被修改(增,刪,改),只能查看,無法使用內置函數進行新增元素以及刪除元素,但是可以是自定義函數進行增加元素以及刪除元素。
而數組可以使用append()函數新增或者是刪除元素。
2.創建元組
創建一個元組
tuple0=(1,26)
tuple1=("15","sy")
tuple2=[(1,"a"),(2,"b"),(3,"c")]
創建一個空的元組
Tuple=()
給空的元組賦值
ListA=[1,2,3,4,5]
Tuple=()
for a in range(2):
Tuple=Tuple+(ListA,)
print(Tuple)
讀取元組數據
tupe1 = ('physics', 'chemistry', 1997, 2000)
tupe2 = (1, 2, 3, 4, 5, 6, 7 )
print("tupe1[0]: "+ tupe1[0])
print("tupe2[0]: "+ tupe2[0])
3.修改元組
元組內的元素無法進行修改,但是元組之間可以像字符串一樣進行運算。
元組之間可以使用 + 號和 * 號進行運算。這就意味着他們可以組合和複製,運算後會生成一個新的元組
tupe1 = (12, 34.56)
tupe2 = ('abc', 'xyz')
# 以下修改元組元素操作是非法的
# tupe1[0] = 100
# 創建一個新的元組
tupe3 = tupe1 + tupe2
print (tupe3)
#以上實例輸出結果:
#(12, 34.56, 'abc', 'xyz')
4.刪除元組
tup = ('physics', 'chemistry', 1997, 2000)
print tup
del tup
5.元組的內置函數
Python元組包含了以下內置函數
cmp(tuple1, tuple2):比較兩個元組元素。
len(tuple):計算元組元素個數。
max(tuple):返回元組中元素最大值。
min(tuple):返回元組中元素最小值。
tuple(seq):將列表轉換爲元組。
6.元組在MySQL的方面的應用
元組(Tuple)的使用非常有效,尤其是在大批量數據插入數據庫的情況下,非常高效
思路如下:
首先,大數據讀取,選擇pandas進行讀取,具體pandas的用法,可以自行百度。
然後,在pandas讀取外部大批量數據,我們選擇csv格式類型(xlsx類型的數據讀取速度很滿,不滿足高效率的原則),該文件大約18M,包含47000行,58列數據。
t = time.time()
dir = r'C:\pcCharm Project\20191021\01\風速4ms.csv'
DataFromExcel = pd.read_csv(dir, header=5,low_memory=False)
print("讀取原數據.==>> 耗時:{}'s".format(round(time.time() - st, 3)))
#轉爲DataFrame
DFExcel=pd.DataFrame(DataFromExcel)
其次,將pandas讀取到數據(DataFrame)進行處理進行清理,然後轉爲元組類型(Tuple)。
#丟棄不需要的行
ConvertDFExcel=DFExcel.drop([0,0])
#格式化DataFrame
#刪除列名裏的空格
ConvertDFExcel = ConvertDFExcel.rename(columns=lambda x: x.replace(" ","")).replace(" ","")
#將TimeMap轉爲DateTime,以便與MySQL數據類型統一
ConvertDFExcel['Time'] = pd.to_datetime(ConvertDFExcel['Time'])
#將DataFrame轉爲元組數據
dataTuple = [tuple(xi) for xi in ConvertDFExcel.values]
最後,使用executemany命令插入MySQL數據庫。
#設置MySQL連接屬性
conn = pymysql.connect(host='localhost', user='root', password='root')
pymysql.charset = 'utf-8'
cur = conn.cursor()
conn.select_db('hkpro')#選擇數據庫名稱
try:
cur.executemany("insert into tp_windv(Time,WindVxi,WindVyi,) values(%s,%s,%s)", dataTuple)
conn.commit()
print("插入數據庫成功")
except Exception as err:
print("插入數據庫失敗")
print("error:",str(err))
finally:
cur.close()
conn.close()
完整代碼如下:
import pandas as pd
import pymysql
pymysql.install_as_MySQLdb()
import datetime
import time
##測試版本,可以插入數據庫
#字符串進行時間轉換
date_string = "2019-09-23 19:56:15"#開始記錄時間
date_Convert=datetime.datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
#自定義函數分割線************************************開始***************************************自定義函數分割線
#時間遞增函數
def AddTime(x):
if is_number(x)==True:
#按秒相加
y = datetime.timedelta(seconds=x) + date_Convert
return y
else:
return x
#字符串前後刪除空格函數
def clear(s):
if s[0] == ' ':
return clear(s[1:])
elif s[-1] == ' ':
return clear(s[:-1])
else:
return s
#判斷是否是數字
def is_number(s):
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
#自定義函數分割線************************************結束***************************************自定義函數分割線
st = time.time()
dir = r'C:\pcCharm Project\20191021\01\風速4ms.csv'
DataFromExcel = pd.read_csv(dir, header=5,low_memory=False)
print("讀取原數據.==>> 耗時:{}'s".format(round(time.time() - st, 3)))
#轉爲DataFrame
DFExcel=pd.DataFrame(DataFromExcel)
#丟棄不需要的行
ConvertDFExcel=DFExcel.drop([0,0])
#格式化DataFrame
#刪除列名裏的空格
ConvertDFExcel = ConvertDFExcel.rename(columns=lambda x: x.replace(" ","")).replace(" ","")
#Object對象轉爲Float64進行時間運算
ConvertDFExcel['Time'] = pd.to_numeric(ConvertDFExcel['Time'], errors='ignore')
#時間遞增加入ConvertDFExcel
ConvertDFExcel['Time']=ConvertDFExcel['Time'].apply(AddTime,0)
#轉爲元組數組
ConvertDFExcel['Time'] =ConvertDFExcel['Time'].apply(str)
dataTuple = [tuple(xi) for xi in ConvertDFExcel.values]
print("轉換原數據.==>> 耗時:{}'s".format(round(time.time() - st, 3)))
conn = pymysql.connect(host='localhost', user='root', password='root')
pymysql.charset = 'utf-8'
cur = conn.cursor()
conn.select_db('hkpro')
try:
cur.executemany("insert into tp_windv1(Time,WindVxi,WindVyi) values(%s,%s,%s)", dataTuple)
conn.commit()
print("插入數據庫成功")
except Exception as err:
print("插入數據庫失敗")
print("error:",str(err))
finally:
cur.close()
conn.close()
print("插入數據庫.==>> 耗時:{}'s".format(round(time.time() - st, 3)))
運行結果如下:
事實證明,處理萬條數據以及插入數據庫的速度不差。
如果使用線程池進行上傳數據庫,時間會短很多。