Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向mysql数据库提供python解析数据时出错_Python_Mysql_Parsing - Fatal编程技术网

向mysql数据库提供python解析数据时出错

向mysql数据库提供python解析数据时出错,python,mysql,parsing,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

我使用这段代码将我从网页解析的一些数据提供给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
)
解析的数据如下所示(有几百行这样的代码)

如果我像上面那样硬编码数据,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:没有足够的参数用于格式化字符串”

在玩了几个小时的格式化选项后(我对这个很陌生),我很困惑。。。硬编码数据和处理结果之间有什么区别这个函数就像mySQL一样重要

非常感谢您的任何想法

这是一个猜测

processThis
返回一个字符串。它不会返回元组列表

如果尝试
repr(清除数据)
,会发生什么情况?我想你会得到如下结果:

"[(161,00:00:00,8.19,1,4.46,4,7.87,4,6.54,null,4.45,6,2010-04-12)]"
这是一个字符串。因此,您将向查询传递一个字符串参数,而不是13个值


您的数据解析需要改进。您需要拆分字符串并将值转换为整数、浮点数等。

以下是将字符串解析为单独值的尝试:

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)]
它应该为要传递给ExecuteMy的每一行提供一个适当的列表


--保罗

我们不知道。显示处理结果。处理结果是上面第二个框中的clean_数据的硬编码版本。这就是我在处理MySQL后试图提供给它的内容。
cleaner=…
缺少引号,可能更多。
str
是内置类型。最好不要将它用作变量名。你是对的。如果我将clean_数据传递给eval(),它将成为一个元组。你也说得对,我在语法分析方面一窍不通;)非常感谢你的建议。它帮我想清楚了。谢谢你的建议。你的方法显然是“正确的”。我试图通过把一堆代码转换成“看起来”已经被解析的东西来争取时间。问题是MySQLdb可以将所有变量作为字符串传递给数据库,MySQL仍然会根据它们在数据库表中的定义来解释它们。因此,如果我将日期作为引号之间的字符串传递给MySQL日期字段,MySQLdb将删除引号,MySQL将看到一个日期。。。这很奇怪,但它使我的生活更容易,因为我不必正确地解析。
[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)]