使用python解析的数据提供mysql数据库时出错

时间:2010-04-11 17:50:43

标签: python mysql parsing

我使用这段代码将我从网页解析的一些数据提供给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>

任何想法都非常感激......

2 个答案:

答案 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提供一个正确的列表。

- 保罗