2016-10-26 5 views
0

Я пытаюсь импортировать CSV-файл в mysql, используя python для практики. Я считаю, что я загрузил правильные библиотеки. Каждый раз, когда я запускаю свой код, я получаю ошибку:Импорт CSV в Mysql Python 3.x

mysql.connector.errors.ProgrammingError: 1064 (42000): У вас возникла ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с '% s,% s,% s,% s,% s,% s,% s,% s,% s,% s)' at line 1

Я не могу понять, почему это не сработает, и все ответы, похоже, используют mysqldb, который не поддерживает python 3.x.

Мой код:

import mysql.connector 
import pandas as pd 

cnx = mysql.connector.connect(user='root', password='comeonin', host='127.0.0.1', database='boxresults') 
cursor = cnx.cursor() 
csv_data = pd.read_csv('Betting/boxresults3.csv') 

for row in csv_data: 
    cursor.execute("INSERT INTO table1(Week, Day, Date, Winner, Loser, PtsW, PtsL, YdsW, TOW, YdsL, TOL) VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s, %s)", row) 


cursor.close() 
cnx.close() 

Новый код:

import mysql.connector 
import pandas as pd 

cnx = mysql.connector.connect(user='root', password='comeonin', host='127.0.0.1', database='boxresults') 
cursor = cnx.cursor() 
csv_data = pd.read_csv('Betting/boxresults3.csv') 

for row in csv_data.iterrows(): 
    list = row[1].values 
    cursor.execute("INSERT INTO table1(Week, Day, Date, Winner, Loser, PtsW, PtsL, YdsW, TOW, YdsL, TOL) VALUES('%d','%s','%s','%s','%s','%d','%d','%d','%d','%d', '%d')" % tuple(list)) 

cursor.close() 
cnx.close() 
+0

печати 'строк 'и посмотреть, что у вас есть в строке. 'execute()' ожидает кортеж с 11 элементами. – furas

+0

Когда я печатаю строку, я получаю 11 разных имен столбцов, но я не думаю, что это кортеж. Он печатает их 1 на 1. – Evy555

+0

Почему накладные расходы на панды? Модуль Csv прекрасно справился бы. И если вы используете, панды рассмотрят его [to_sql] (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_sql.html) для массового добавления в один вызов. Еще в MySQL есть команда [LOAD DATA INFILE] (http://dev.mysql.com/doc/refman/5.7/en/load-data.html) для текстовых файлов. – Parfait

ответ

0

Вы неправильно row.

for row in csv_data 

дает столбца имя в row

Чтобы получить строку, которую нужно iterrows()

for row in csv_data.iterrows(): 

Но это row имеет не только values, но другая информация. Вы значение в row[1] но Series объекта, так что вам нужно values, чтобы получить значение в списке

for row in csv_data.iterrows(): 
    print(row[1].values) 

Полный рабочий пример:

import pandas as pd 

df = pd.DataFrame([[1,2,3], [4,5,6]], columns=['a','b','c']) 

print(df) 

for row in df.iterrows(): 
    print('type:', type(row[1])) 
    print('values:', row[1].values) 

Результаты:

a b c 
0 1 2 3 
1 4 5 6 
type: <class 'pandas.core.series.Series'> 
values: [1 2 3] 
type: <class 'pandas.core.series.Series'> 
values: [4 5 6] 
+0

Это помогает мне разбить каждую строку. Но список по-прежнему не может быть введен в mysql. Я получаю ту же ошибку. Правильно ли этот список введен неверно как 11 значений для ожидания 11 значений в выполнении? – Evy555

+0

Он работает, если я использую кавычки '('% s', '% s', '% s', '% s', '% s', '% s', '% s', '% s' '% s', '% s', '% s') ' – furas

+0

Мне пришлось внести некоторые изменения в мой код. Я получил его для запуска без ошибок, но таблица ничего не заполняет. Я добавил свой новый код выше. – Evy555