TypeError: ожидающий объект строки или байта


Привет,
Я пытаюсь вставить данные CSV в таблицу оракула. Но получаю ошибку как

TypeError: ожидающий объект строки или байта

with open('file.csv', 'r') as srcfile:
reader = csv.reader(srcfile, dialect = 'fileProperties')
header = next(reader)
header = ", ".join(str(h) for h in header)
insert = 'insert into table (' + header + ') values ('
#print(insert) 

for row in reader:
    data = [insert + str(row).strip("[]") + ');']

cur.prepare(data)
cur.execute(data)


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-154-8814eee5c788> in <module>
  1 #cur.prepare(data)
----> 2 cur.execute(data)

TypeError: expecting string or bytes object

Пожалуйста, направьте меня, если я ошибаюсь в коде.

1 ответ

Решение

Решил вопрос.

* Первая проблема: список не может быть передан как параметр при использовании executemany, но список работает при использовании execute
* Вторая проблема заключается в необходимости привязки исходных данных при вставке. Однако вместо жесткого кодирования переменных привязки, получения имен столбцов и динамической передачи переменных привязки, так что любой столбец, добавленный или удаленный в файле, может быть обработан без изменения кода

with open('G:\Project\ETL\data\CME.csv', 'r') as srcfile:
reader = csv.reader(srcfile, dialect = 'fileProperties')
header = next(reader)
columns = ", ".join(str(h) for h in header)
length = len(next(reader))
bind = []
data = []

for binds in range(1, length+1):
    bind.append(':' + str(binds))


insert = 'insert into ledger_source_python (' + columns + ') values (' + ", ".join(str(l) for l in bind) + ')' 

for row in reader:
    data.append(row)

cur.executemany(insert, data)
con.commit()

Спасибо, ребята, за все ваши комментарии.

Другие вопросы по тегам