【发布时间】:2023-03-04 11:39:01
【问题描述】:
我的一个 SQLite 数据库表有一个出版物引用字段。我正在尝试从源 Excel 文件更新/附加到数据库表。所以,我使用 pandas 来引入 Excel 文件,并编写了一个循环来逐行更新。 (注意,我写了一个循环而不是使用 pandas '.to_sql',因为在替换时,它会从 SQLite 表中删除主键。)
我在尝试更新 SQLite 表时收到与 ascii 编码相关的错误。错误与破折号、作者姓名中的重音字母等有关。
如何强制忽略/替换编码错误并默认为某种简单字符串? 引用字符串在 SQL 表中完美复制并不重要.
如果我删除存在编码问题的 Citations 字段,则下面的循环将起作用。
# 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)
【问题讨论】:
标签: pandas python-2.7 sqlite