Я пытаюсь импортировать файл CSV в mysql, используя python. Я получаю сообщение об ошибке "TypeError: недостаточно аргументов для строки формата" - PullRequest
0 голосов
/ 05 августа 2020

Я использую phpmyadmin для mysql базы данных.

import csv
import MySQLdb
import pymysql

db = pymysql.connect(
    host="127.0.0.1",
        port=3308,
        user="root",
        passwd="",
        db="database_name"
 )
cursor = db.cursor()

csv_data = csv.reader(r'E:\py_docs\file101.csv')
next(csv_data)
for row in csv_data:

    cursor.execute('INSERT INTO table_name(A, B, C, D, E, F, G, H, I, J, K, L, M )' 'VALUES("%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s", "%s")', row)
db.commit()
cursor.close()
print("Done")

Я получаю сообщение об ошибке:

query = query % self._escape_args(args, conn)
TypeError: not enough arguments for format string

Я использую py mysql. Есть ли другой способ импортировать csv в Mysql, используя python?

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Вы получаете эту ошибку, потому что ваша «строка» CSV не всегда содержит 13 столбцов. Лучший способ сделать это - вставить пустую строку ("") или null в строки csv для столбцов, для которых у вас нет значений.

0 голосов
/ 05 августа 2020

Строка формата (запрос) содержит больше вхождений% s, чем вы указали аргументов в строке из файла csv. Во всех ли строках одинаковое количество полей?

Мне всегда больше везло с именованными параметрами при выполнении sql. Этот фрагмент кода захватывает заголовки из первой строки csv, а затем создает список словарей, которые используют эти заголовки из остальной части файла. Это позволяет нам вызывать executemany (query_string, list) и использовать в запросе именованные заполнители.

Используя именованные заполнители, порядок и количество параметров не так уж и важны. Пока у вас есть поле в словаре для каждого заполнителя, все будет само по себе в порядке упорядочивания. У вас также могут быть дополнительные поля в словаре, которые вы не используете в запросе, без его взрыва. Эти свойства упрощают внесение изменений как в запрос, так и в код, а также делают ваш sql намного более читабельным.

Использование executemany может быть более эффективным, если драйвер поддерживает подготовленные запросы.

import csv
import pymysql

data = [] 
headers = True
with open('E:\py_docs\file101.csv') as f:
    for row in csv.reader(f):
        if headers:
            fields = [field for field in row]
            headers = False
        else:
            data.append({field: val for field, val in zip(fields, row)})
with pymysql.connect(host="127.0.0.1", port=3308, user="root", passwd="", db="database_name").cursor() as cur:
    cur.executemany("insert into table_name (field_1, field_2, field_3, ...) "
        "values (%(csv_fld_1)s, %(csv_fld_2)s, %(csv_fld_3)s, ...) "
        ,data)
    cur.connection.commit()```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...