2011-03-11 42 views
11

我在將CSV文件加載到mysql數據庫時遇到了一些問題。這裏是我的代碼:TypeError:並非在字符串格式化期間轉換的所有參數

for q in csvReader: 
    name, price, LastUpdate, today = q 
    co.execute("""INSERT INTO fundata (name, price, LastUpdate) VALUES(name, price, LastUpdate);""",q) 

我得到一個錯誤,說TypeError:不是在字符串格式化過程中轉換的所有參數。

名稱列是一個字符串,價格是浮點數,LastUpdate是日期。我讀了一下,看到一些腳本包裝%(值)s和%(值)d(在我的情況下,而不是d我使用f)的價值觀,但然後我得到一個不同的錯誤:

TypeError:format需要一個映射

任何人都可以幫助告訴我我做錯了什麼?

謝謝!

+0

你使用的是什麼mysql庫? – chmullig

+0

在python中,我使用MySQLdb – Lostsoul

回答

14

如果我沒有記錯,你在查詢中應該使用%s和MySQLdb來表示您希望格式化參數元組元素的位置。這與大多數其他實現中使用的通常的?佔位符不同。

for q in csvReader: 
    name, price, LastUpdate, today = q 
    co.execute("INSERT INTO fundata (name, price, LastUpdate) VALUES(%s, %s, %s);",q) 

編輯:這裏也是一次插入多行的例子,比一個插入多個行更有效。從MySQLdb User's Guide

c.executemany(
     """INSERT INTO breakfast (name, spam, eggs, sausage, price) 
     VALUES (%s, %s, %s, %s, %s)""", 
     [ 
     ("Spam and Sausage Lover's Plate", 5, 1, 8, 7.95), 
     ("Not So Much Spam Plate", 3, 2, 0, 3.95), 
     ("Don't Wany ANY SPAM! Plate", 0, 4, 3, 5.95) 
     ]) 

Here we are inserting three rows of five values. Notice that there is a mix of types (strings, ints, floats) though we still only use %s. And also note that we only included format strings for one row. MySQLdb picks those out and duplicates them for each row.

+0

感謝Timo。我嘗試了你發佈的第一個代碼(for語句),並且仍然出現這個錯誤:TypeError:並非在字符串格式化過程中轉換的所有參數 我想我需要一個for循環,因爲我需要在腳本中編寫更多的邏輯(即更改姓名到身份證號碼等)。我不知道它是否有幫助,但這裏有更多的代碼:co = db.cursor()dataFile = file(「funds.csv」,「rb」) csvReader = csv.reader(dataFile) – Lostsoul

+0

對不起,您可以嘗試刪除逐字字符串(三引號)標識符,並嘗試是否修復它。 – Timo

+0

你應該使用?而不是數據庫內部值插入的%s –

1

格式要求映射是因爲您要爲字符串替換令牌設置一個名稱並且需要字典。

,如果你把它們作爲%S%d%F等用了括號,將採取的參數,以便從列表或元組(Q)

for q in csvReader: 
    co.execute("""INSERT INTO fundata (name, price, LastUpdate) VALUES(%s, %f, %s);""",q[:-1]) 
5

從錯誤信息,該​​方法是使用%替換您的參數到您的SQL語句。但是你沒有指出它們中的哪一個去了,所以你的參數都沒有被使用,它們都被遺留下來了,因此你得到了一些遺留下來的信息(嘿,都是一些!)。閱讀您的數據庫驅動程序的文檔,找出您希望用作替代標記的內容;大概是%s

相關問題