最近開始學python,在資料庫讀取的部分使用pymysql
但發現pymysql 在select出來的資料是tuple,當我如php一樣對其陣列內容打入欄位名稱時會出現type Error,
TypeError: tuple indices must be integers or slices, not str
因為pymysql所存放的格式是長這樣的
(1264, 94, 2018, 11, 9, 5, 48, 12, 15, 14, 22, 4, 4, 12, 14, 15, 22, 48, 28)
這樣的話你就只能用array[0],array[1],array[2]...方式進行取值,在程式的可讀性上變得很差
理想的情形是array["year"] ,array["month"]這種對人類來有意義的文字,可讀性比較高
所以我的目標即把select 出來的內容轉成如下格式
{'serial': 1269, 'round': 99, 'year': 2018, 'month': 11, 'day': 27, 'week': 2, 'o1': 27, 'o2': 36, 'o3': 43, 'o4': 44, 'o5': 41, 'o6': 33, 's1': 27, 's2': 33, 's3': 36, 's4': 41, 's5': 43, 's6': 44, 'sp': 31}
---------------------------------------------------------------------------------------------------------------------
以下範例
例如在php,我從資料select出0~50的數字,當程式判斷該o1~o6欄的數字,並在相對位置的陣列位置的值+1,這樣就可以計算出每一個數字有幾個
ex:第一個row 的o1值為27,則在陣列的第27個位置的值+1
$str= "select * from raw_number where year='2018'";
$time_count=Array();
$i=0;
while($i<=50){
$time_count[]=0;
$i++;
}
$data=$db->query($str)->fetchAll();
foreach($data as $d){
$time_count[$d['o1']]+=1; //這寫法在php可以,但在pymysql無法
$time_count[$d['o2']]+=1;
$time_count[$d['o3']]+=1;
$time_count[$d['o4']]+=1;
$time_count[$d['o5']]+=1;
$time_count[$d['o6']]+=1;
$time_count[$d['sp']]+=1;
}
-----------------------------------------------------------------------------------
而在python,幾經google找尋後,pymysql 出來的資料可以使用map的方式把資料配對組好,組好後轉成list即可
雖然有點麻煩,但其實不過就是多寫二行
#cursor.description是列出欄位名稱,不熟的朋友可以直接print(cursor.description)看看
#new2dict函數,這個函數是自定義函數,也就是我寫來把欄位名稱和值配在一起用的
#接著下一行會使用map()這個函數把從資料庫fetchall()中所有的值和欄位配在一起
def new2dict(new):
return dict(zip([x[0] for x in cursor.description],[x for x in new]))
new_list = list(map(new2dict,cursor.fetchall()))
for i in new_list:
nu[i["o1"]]+=1 #o1
nu[i["o2"]]+=1 #o2
nu[i["o3"]]+=1 #o3
nu[i["o4"]]+=1 #o4
nu[i["o5"]]+=1 #o5
nu[i["o6"]]+=1 #o6
nu[i["sp"]]+=1 #sp
沒了....其實就是多了一個new2dict和map(),接下來的邏輯就和php差不多
沒有留言:
張貼留言