Одна из моих таблиц базы данных SQLite имеет поле цитирования публикации.Я пытаюсь обновить / добавить в таблицу базы данных из исходного файла Excel.Итак, я использую панды, чтобы ввести файл Excel, и я написал цикл для обновления по строке.(Обратите внимание, я написал цикл вместо использования панд '.to_sql', потому что при замене он удаляет первичные ключи из таблицы SQLite.)
При попытке обновить я получаю сообщение об ошибке, касающееся кодировки ascii.таблица SQLite.Ошибки связаны с тире, акцентированными буквами в именах авторов и т. Д.
Как я могу принудительно игнорировать / заменять ошибки кодирования и просто использовать по умолчанию простую строку? Не важно, чтобы строка цитирования была идеально реплицирована в таблице SQL.
Цикл, приведенный ниже, работает, если я опускаю поле Цитирования, в котором есть проблемы с кодировкой.
# my variables:
# fileIn, tab, db_path
import pandas as pd, sqlite3
xls = pd.ExcelFile(fileIn)
df = xls.parse(tab)
df['Citation'] = df['Citation'].fillna(value='tbd')
df = df.drop('Citation', axis= 'columns')
# drop for now, issues with unicode characters
conn = qlite3.connect(db_path)
cur = conn.cursor()
allfields = list(df)
allfields.remove('index')
fields2 = ', '.join(str(x) for x in allfields)
cells = ['?'] * len(allfields)
cells = ', '.join(str(x) for x in cells)
str_sql = 'INSERT INTO ' + tablename + ' (' + fields2 + ') ' + 'VALUES' + ' (' + cells + ')'
for row in df.index.values:
val = ['?'] * len(allfields)
for ii in range(len(allfields)):
field = allfields[ii]
val[ii] = df.loc[row].at[field]
# issues with unicode characters from Citations in val
print val
cur.executemany(str_sql, (val,))
del val
conn.commit()
conn.close()
Также стоит отметить, что я исправил ошибки предыдущих типов, поместив это перед циклом:
sqlite3.register_adapter(np.float64, float)
sqlite3.register_adapter(np.float32, float)
sqlite3.register_adapter(np.int64, int)
sqlite3.register_adapter(np.int32, int)
def adapt_datetime(datetime):
return (datetime.strftime('%Y-%m-%d %H:%M:%S')).encode()
sqlite3.register_adapter(dt.datetime, adapt_datetime)
sqlite3.register_adapter(dt.date, adapt_datetime)