Python元組(Tuple)的入門案例以及MySQL插入

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)))

運行結果如下:

事實證明,處理萬條數據以及插入數據庫的速度不差。

如果使用線程池進行上傳數據庫,時間會短很多。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章