2015-10-08 70 views
-1

我試圖創建一個快速導入腳本,我茬了很奇怪的東西。字符串附加行爲真的很奇怪Python

我做以下

print "insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,{0},{1})".format(value, TimeStamp) 

,我希望得到的結果是正常的,堅韌的結果看起來是這樣的

,15-08-2015 20:28:47)nentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,41,8 

任何人都可以解釋我爲什麼時間戳值是在正面和不是後方?

+1

你能告訴我們你的腳本嗎?這可能是因爲您將輸出重定向到一個文件中,而其他內容也正在寫入該文件或任何類似的情況。 –

+5

我會100%確定'print(repr(Timestamp))'會給 - ''8 \ r,15-08-2015 20:28:47''。你能檢查出來嗎?如果是這樣,'\ r'是問題,它將光標移回行首。或者'print(repr(value))'給出''41,8'r''。 –

+0

TimeStamp變量中是否有任何控制字符? – AlG

回答

1

您的字符串值包含\r回車符。該字符指示打印位置到行的開頭。您可以通過打印repr() function的輸出來驗證這一點,該輸出對任何不是可打印的ASCII字符的字符使用Python轉義序列。

刪除TimeStamp值中的字符;你可以使用str.replace()要做到這一點,例如:

TimeStamp = TimeStamp.replace('\r', '') 

演示:

>>> value, TimeStamp = 41, '8\r,15-08-2015 20:28:47' 
>>> print "insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,{0},{1})".format(value, TimeStamp) 
,15-08-2015 20:28:47)nentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,41,8 
>>> TimeStamp = TimeStamp.replace('\r', '') 
>>> print "insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,{0},{1})".format(value, TimeStamp) 
insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,41,8,15-08-2015 20:28:47) 

請注意,你的價值仍然包含逗號!您可能在之前的某個文件或其他來源解析這些數據時出錯。

此外,使用字符串格式化插入數據到一個SQL語句是不是一個好主意。改用SQL參數。根據您的數據庫適配器上,這將意味着你在查詢中使用?%s作爲佔位符,數據庫適配器將然後正確報價值,以防止SQL注入攻擊,並允許在查詢處理優化技術:

cursor.execute(
    "insert into Log(ComponentId, Value, TimeStamp) OUTPUT INSERTED.ID VALUES(8,?,?)", 
    (value, TimeStamp)) 

有關詳細信息,請參閱您的數據庫適配器文檔。

+0

是的,做到了這一招,謝謝:) – Mickboe1