类型错误:字符串格式化时未完全转换所有参数
我在把一个CSV文件加载到mysql数据库时遇到了一些麻烦。以下是我的代码:
for q in csvReader:
name, price, LastUpdate, today = q
co.execute("""INSERT INTO fundata (name, price, LastUpdate) VALUES(name, price, LastUpdate);""",q)
我收到一个错误提示,内容是TypeError: not all arguments converted during string formatting。
其中,name这一列是字符串,price是浮点数,LastUpdate是日期。我查了一些资料,看到有些脚本把值用%(value)s和%(value)d包裹起来(在我的情况下,d换成了f),但这时我又遇到了一个不同的错误:
TypeError: format requires a mapping。
有没有人能帮我看看我哪里出错了?
谢谢!
3 个回答
1
格式化需要映射的原因是你给字符串替换的标记设置了名字,所以需要一个字典。
如果你把它们留作 %s、%d、%f 等等,而不加括号,它会按照顺序从列表或元组中取参数。
for q in csvReader:
co.execute("""INSERT INTO fundata (name, price, LastUpdate) VALUES(%s, %f, %s);""",q[:-1])
5
从错误信息来看,execute()
这个方法在把你的参数放进SQL语句时使用了%
符号。但是你没有告诉它这些参数应该放在哪里,所以这些参数没有被用上,结果就剩下了一些没用的参数,因此你收到了关于有剩余参数的提示(其实就是有剩余的意思!)。你可以查一下你数据库驱动的文档,看看它希望你用什么符号来替代参数;很可能是%s
。
15
如果我没记错的话,在使用MySQLdb进行查询时,你应该用%s
来表示你想要格式化的位置,这和大多数其他实现中使用的?
占位符是不一样的。
for q in csvReader:
name, price, LastUpdate, today = q
co.execute("INSERT INTO fundata (name, price, LastUpdate) VALUES(%s, %s, %s);",q)
编辑:这里还有一个例子,展示如何一次性插入多行数据,这比一个一个插入要高效得多。来自MySQLdb用户指南:
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 )
] )
在这里,我们插入了三行,每行有五个值。注意,这里有不同类型的数据(字符串、整数、浮点数),但我们仍然只使用了%s。而且要注意,我们只为一行提供了格式字符串。MySQLdb会自动识别并为每一行复制这些格式。