【问题标题】:Python / Pandas to SQLite - ascii encoding errorsPython / Pandas 到 SQLite - ascii 编码错误
【发布时间】: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


    【解决方案1】:

    找到答案here

    新代码,就像一个魅力:

    xls = pd.ExcelFile(fileIn)
    df = xls.parse(tab)
    df['Citation'] = df['Citation'].fillna(value='tbd')
    df.Citation = df.Citation.map(unicode)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-19
      • 1970-01-01
      • 2015-01-28
      • 2015-02-03
      • 2019-09-01
      • 2014-08-14
      相关资源
      最近更新 更多