我使用这段代码将我从网页解析的一些数据提供给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
)
解析后的数据看起来像这样(有几百条这样的行)
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定义为解析代码的结果,则如下所示:
cleaner = [(""" $!!'""", ')]'),(' $!!', ') etc etc]
def processThis(str,lst):
for find, replace in lst:
str = str.replace(find, replace)
return str
clean_data = processThis(data,cleaner)
然后我得到了可怕的“TypeError:没有足够的格式字符串参数”
在玩了几个小时的格式化选项后(我对此很新)我很困惑...硬编码数据和process的结果有什么区别这个函数和mySQL有关?? / p>
任何想法都非常感激......
答案 0 :(得分: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个值。
您的数据解析需要改进。您需要拆分字符串并将值转换为整数,浮点数等。
答案 1 :(得分: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)]
应为每行传递给executemany提供一个正确的列表。
- 保罗