Python / Pandas to SQLite - ошибки кодирования ascii - PullRequest
0 голосов
/ 05 февраля 2019

Одна из моих таблиц базы данных 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)

1 Ответ

0 голосов
/ 06 февраля 2019

нашел ответ здесь

новый код, работает как брелок:

xls = pd.ExcelFile(fileIn)
df = xls.parse(tab)
df['Citation'] = df['Citation'].fillna(value='tbd')
df.Citation = df.Citation.map(unicode)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...