Ошибка при загрузке базы данных mysql с данными, проанализированными на Python - PullRequest
0 голосов
/ 11 апреля 2010

Я использую этот бит кода для подачи некоторых данных, которые я проанализировал, с веб-страницы в базу данных 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)

тогда я получаю страшное «Ошибка типа: недостаточно аргументов для строки формата»

После нескольких часов игры с опциями форматирования (я новичок в этом), я запутался ... в чем разница между жестко закодированными данными и результатом процесса? 1014 *

Любая идея с благодарностью ...

Ответы [ 2 ]

1 голос
/ 11 апреля 2010

Это предположение ...

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 значений.

Ваш анализ данных должен быть улучшен. Вы хотите разделить строку и преобразовать значения в целые числа, числа с плавающей точкой и т. Д.

0 голосов
/ 12 апреля 2010

Вот пример разбора вашей строки на отдельные значения:

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.

- Пол

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...