2010-04-11 50 views
0

我使用這段代碼的一些數據我已經從網頁解析喂到MySQL數據庫錯誤餵養與蟒蛇解析的數據

c=db.cursor() 
c.executemany(
"""INSERT INTO data (SID, Time, Value1, Level1, Value2, Level2, Value3, Level3, Value4, Level4, Value5, Level5, ObsDate) 
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)""", 
clean_data 
) 

解析的數據是這樣的一個MySQL數據庫(當有幾百個這樣的行)

clean_data = [(161,00:00:00,8.19,1,4.46,4,7.87,4,6.54,null,4.45,6,2010-04-12),(162,00:00:00,7.55,1,9.52,1,1.90,1,4.76,null,0.14,1,2010-04-12),(164,00:00:00,8.01,1,8.09,1,0,null,8.49,null,0.20,2,2010-04-12),(166,00:00:00,8.30,1,4.77,4,10.99,5,9.11,null,0.36,2,2010-04-12)] 

如果我硬碼的數據如上mySQL的接受我的請求(除了關於格式化一些狡辯)

但如果變量clean_data是inste廣告定義爲解析代碼的結果是這樣的:

cleaner = [(""" $!!'""", ')]'),(' $!!', ') etc etc] 
def processThis(str,lst): 
    for find, replace in lst: 
     str = str.replace(find, replace) 
    return str 
clean_data = processThis(data,cleaner) 

然後我得到了可怕的「類型錯誤:沒有足夠的論據格式字符串」

用了幾個小時的格式選項打(我之後我很困惑......硬編碼數據和過程結果之間有什麼區別這個函數和mySQL一樣關鍵嗎?

任何想法不勝感激...

+1

我們不知道。顯示處理結果。 – 2010-04-11 17:52:30

+0

處理的結果是上面第二個框中的clean_data的硬編碼版本。這是我正在處理後嘗試向MySQL提供的內容。 – Barnabe 2010-04-11 17:59:20

+1

'cleaner = ...'缺少一個引號,可能更多。 – 2010-04-11 18:01:55

回答

0

這是在解析你的字符串爲單獨的值的刺:

import datetime 
import time 
src = "161,00:00:00,8.19,1,4.46,4,7.87,4,6.54,null,4.45,6,2010-04-12" 
asFloat = lambda x : float(x) 
asInt = lambda x : int(x) 
asTime = lambda x : datetime.datetime(*time.strptime(x,'%H:%M:%S')[:7]).time() 
asDate = lambda x : datetime.datetime(*time.strptime(x,'%Y-%m-%d')[:3]).date() 
asNone = lambda x : None if x=='null' else int('ValueError') 
converters = (asDate,asTime,asInt,asFloat,asNone,) 
def convert(x): 
    for cnv in converters: 
    try: 
     return cnv(x) 
    except ValueError: 
     pass 
    return x 

clean_data = [convert(s) for s in src.split(',')] 
print clean_data 

給出:

[161, datetime.time(0, 0), 8.1899999999999995, 1, 4.46, 4, 
7.8700000000000001, 4, 6.54, None, 4.4500000000000002, 6, 
datetime.date(2010, 4, 12)] 

這應該給每一行傳遞給執行者一個適當的列表。

- Paul

+0

謝謝你提出這個建議。你的方法顯然是'正確'的。我試圖通過將一堆代碼轉化爲「看起來像」已被解析的東西來獲得時間。問題是MySQLdb可以將所有的變量作爲字符串傳遞給數據庫,MySQL仍然會按照數據庫表中的定義來解釋它們。因此,如果我將一個日期作爲引號之間的字符串傳遞給MySQL日期字段,那麼MySQLdb會刪除引號,並且MySQL會看到一個日期......這很奇怪,但它使我的生活變得更加輕鬆,因爲我無需解析「正確」 。 – Barnabe 2010-04-13 02:28:32

1

這是一個猜測...

processThis返回一個字符串。它不返回元組列表。

如果您嘗試repr(clean_data),會發生什麼情況?我想你會得到如下內容:

"[(161,00:00:00,8.19,1,4.46,4,7.87,4,6.54,null,4.45,6,2010-04-12)]" 

這是一個單獨的字符串。所以你傳遞一個字符串參數給查詢,而不是13個值。

您的數據解析將需要改進。你將要拆分的字符串並轉換成數值整數,浮點數等

+0

你說得對。如果我將clean_data傳遞給eval(),它將成爲一個元組。你也是對的,我是在解析垃圾;)非常感謝您的建議。它幫助我完成了這個想法。 – Barnabe 2010-04-13 02:24:06