2011-12-09 62 views
1

這是我在Python代碼:類型數據的

queryuniq = "SELECT COUNT(distinct src_ip), COUNT(distinct video_id)FROM video" 
cur.execute(queryuniq) 
uniq = [] 
uniq = cur.fetchall() 
print uniq 
ip = str(uniq[0]) 
video = str(uniq[1]) 
fd2.write("There are %d ip addresses and %d video in total" %(int(ip), int(video))) 

這是 「uniq的」 可變我得到的值:

((2052L, 163581L),) 

而且此錯誤消息:

fd2.write("There are %d ip addresses in total" %(int(ip))) 
ValueError: invalid literal for int() with base 10: '((2052L,),)' 
video = str(uniq[1]) 
IndexError: tuple index out of range 

我只是簡單地想要計算數據庫中列中的不同項目,並在文件中打印INT值。

任何人都可以解釋爲什麼SELECT命令返回奇怪的數據格式,如((2052L,163581L),)?不明白爲什麼數字後有一個「L」..

我該如何解決這個問題?非常感謝!

+0

檢查表中的數據,最有可能它包含奇怪格式的數據? –

回答

2

uniq是元組的元組(在外側電平中的每個條目表示數據庫,其內有列的元組值)。

您查詢總是返回一行。因此,外元組總是包含一個元素,你可以通過更換修復代碼:

uniq = cur.fetchall() 

uniq = cur.fetchall()[0] 

另外,從int到字符串中的轉換,然後回到INT是不必要的。

總結,以下是你的代碼的收拾版本:

queryuniq = "SELECT COUNT(distinct src_ip), COUNT(distinct video_id)FROM video" 
cur.execute(queryuniq) 
uniq = cur.fetchall()[0] 
ip, video = uniq 
fd2.write("There are %d ip addresses and %d video in total" %(ip, video)) 
2

有幾件事情你的代碼錯誤。首先,cur.fetchall() - 顧名思義 - 從查詢中獲取所有結果。由於Python不知道你的查詢只返回一行,它仍然返回所有行的元組。因此uniq[0]不引用行中的第一個字段,它引用結果中的第一行。

既然你知道你只想要一行,你可以使用cur.fetchone()

其次,爲什麼你將結果轉換爲字符串,然後將它們轉換回整數?這似乎毫無意義。它們的格式正確 - L意味着它們是「長整數」。