WedX - журнал о программировании и компьютерных науках

Как вставить файлы csv в базу данных, используя столбцы python_

это мой код

import pymysql
import csv

conn=pymysql.connect("localhost", "root","****","finance")
cursor=conn.cursor()       

print "done"
csv_data = csv.reader(file('naver_loan_output.csv'))

for row in csv_data:
    cursor.execute('INSERT INTO 'daily_new' (date,cust_bal, cust_credit, fund_stock, fund_hyb, fund_bond )' 'VALUES("%s", "%s", "%s", "%s", "%s", "%s")',row)
    conn.commit()
    cursor.close()
    print "Done"

И это ошибка:

Файл "D:\dropbox\Dropbox\lab\7_0218\insert_daily_new.py", строка 13 cursor.execute('INSERT INTO 'daily_new' (date,cust_bal, cust_credit, fund_stock, fund_hyb, fund_bond)' 'VALUES("%s ", "%s", "%s", "%s", "%s", "%s")',строка) ^ SyntaxError: недопустимый синтаксис [Завершено через 0,104 с]

Я много пробовал, но я не уверен в правильном синтаксисе запроса на вставку SQL. Как получить столбцы из csv? В моем CSV-файле 6 столбцов.

В этом обновленном примере код работает:

import pymysql
import csv

csv_data= csv.reader(file('naver_loan_output.csv'))

conn=pymysql.connect("localhost","finance")
cursor=conn.cursor()
print "Done"
for row in csv_data:
    #cursor.execute('INSERT INTO \'daily_new\' (date, cust_bal, cust_credit, fund_stock, fund_hyb, fund_bond ) VALUES({}, {}, {}, {}, {}, {})'.format(row[0], row[1], row[2], row[3], row[4], row[5]))
    sql="INSERT INTO  daily_n (date,cust_bal, cust_credit, fund_stock, fund_hyb, fund_bond ) VALUES('2017-01-01','2','2','2','2','2')"
    cursor.execute(sql)
    conn.commit()

cursor.close()

Итак, я думаю, что проблема в for row или %s.

18.02.2017

Ответы:


1

В основном, ваши цитаты являются проблемой.

  1. Вам нужно избегать одинарных кавычек, если большая строка sql заключена в одинарные кавычки; или просто заключите большую строку в двойные кавычки, как в обновленном примере. И обратите внимание: SyntaxError - это ошибка компиляции Python (не исключение времени выполнения MySQL).
  2. Для параметризованных запросов не заключайте в кавычки заполнитель %s.
  3. MySQL (и практически для всех RDMS) не использует одинарные кавычки для заключения ссылок на имена таблиц и столбцов, как вы делаете с 'daily_new'. Используйте обратные кавычки для имен в MySQL. Несколько баз данных и стандарт ANSI допускают двойные кавычки для идентификаторов объектов (не строковых литералов).

Рассмотрим следующую корректировку с более эффективным процессом чтения CSV-файла с использованием with(), а не сразу, как у вас с file(). И, как показано с параметризацией, вы можете подготовить оператор sql один раз, а затем просто итеративно связывать значения в цикле.

strSQL = "INSERT INTO `daily_new` (`date`, cust_bal, cust_credit, fund_stock, fund_hyb, fund_bond )" + \
         " VALUES(%s, %s, %s, %s, %s, %s)"

with open('naver_loan_output.csv', 'r') as f:
    csv_data = csv.reader(f)
    for row in csv_data:
        cursor.execute(strSQL, row)
        conn.commit()

cursor.close()
conn.close()

print "Done"
19.02.2017

2

Я думаю, что вы можете попробовать что-то вроде этого:

query = """'INSERT INTO 'daily_new' (date,cust_bal, cust_credit, fund_stock, fund_hyb, fund_bond )' 'VALUES("""+row+""")'"""
cursor.execute(query)

Просто взгляните на этот фрагмент кода из документа по чтению и записи CSV-файлов:

>>> import csv
>>> with open('eggs.csv', 'rb') as csvfile:
...     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
...     for row in spamreader:
...         print ', '.join(row)
Spam, Spam, Spam, Spam, Spam, Baked Beans
Spam, Lovely Spam, Wonderful Spam

Я надеюсь, что это полезно для вас или что ставит вас на пути.

18.02.2017
  • Спасибо тебе за помощь. Но это не работает... очень грустно. 18.02.2017

  • 3

    Вас сбивают с толку три проблемы:

    1. Экранирующие символы строки

    В вашем коде одиночная кавычка перед daily_new останавливает строку, а python интерпретирует daily_new как переменную, которая не определена.

    Чтобы решить эту проблему, вы должны использовать escape-символ "\" непосредственно перед каждой одинарной кавычкой, которую вы хотите в в строке, например:

    cursor.execute('INSERT INTO \'daily_new\' (date,cust_bal, cust_credit, fund_stock, fund_hyb, fund_bond ) VALUES("%s", "%s", "%s", "%s", "%s", "%s")',row)
    
    1. Доступ к столбцу

    Модуль csv возвращает строки в виде списка. Чтобы получить доступ к элементу в списке (или строке в вашем случае), используйте нотацию скобок. For row[0] обращается к первому элементу (столбцу) в строке, а row[5] обращается к 6-му столбцу.

    1. Замена строки

    Третья проблема, с которой вы сталкиваетесь, заключается в том, как правильно передать значения в подстановку строк. Хотя есть много способов сделать это, самым простым из них является метод format(). Например: если бы я хотел построить строку, которая говорит «Счетчик равен 1», я мог бы запустить "Count is {}".format(1).

    В вашем случае вы хотите добавить 6 значений в строку, поэтому вы добавляете пару {} везде, где хотите, чтобы значение было заменено строкой, и добавляете еще один параметр в функцию format().

    Собираем все вместе

    Итак, чтобы исправить код цикла, вам нужно что-то вроде этого:

    csv_data = csv.reader(file('naver_loan_output.csv'))
    for row in csv_data:
        cursor.execute('INSERT INTO daily_new (date, cust_bal, cust_credit, fund_stock, fund_hyb, fund_bond ) VALUES ({}, {}, {}, {}, {}, {})'.format(row[0], row[1], row[2], row[3], row[4], row[5]))
    
    18.02.2017
  • Спасибо. Я думал о вас так же, поэтому я искал, как получить много строк. Я просто скопировал твою. Но это тоже не работает... Я получил ошибку: (1064, у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с ''daily_new' (дата , cust_bal, cust_credit, fund_stock, fund_hyb, fund_bond ) VALU' в строке 1) [Завершено за 0,264 с] 18.02.2017
  • Я отредактировал последний пример, чтобы удалить экранированные кавычки, которые могут быть проблемой. Поскольку в имени таблицы нет пробелов, можно и без кавычек. 20.02.2017
  • Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]