【问题标题】:Why are these integers being converted to random characters?为什么这些整数被转换为随机字符?
【发布时间】:2020-11-19 03:15:51
【问题描述】:

当我在给定的 csv 文件 (csv_file) 上运行以下 python 脚本时,整数在 sqlite3 数据库中被转换为随机字符。我希望这些整数在输入数据库时​​保持为整数。

data = pd.read_csv(csv_file, header=0)
csv_fieldnames = data.columns.values

"INSERT INTO " + table + " (id, paper, name) VALUES (" + ",".join('?'*len(csv_fieldnames)) + ")"

示例:

示例 csv 文件:

id,paper,name
,7,AC-600

代码产生这个:

id          paper       name
----------  ----------  ----------
1                      AC-600

什么时候应该产生这个:

id          paper       name
----------  ----------  ----------
1           7          AC-600

【问题讨论】:

    标签: python sqlite


    【解决方案1】:

    这里的问题是 Pandas 对于 SQLite3 来说太聪明(或愚蠢)了。您希望包含 int 值的 paper 列接收 numpy.int64 值和 not int 值。 SQLite3 将它们作为纯字节处理,因为它是未知类型。所以 7 被翻译(在小端系统上)为b'\x07\x00\x00\x00\x00\x00\x00\x00',这是一个后跟空字符的空格,不包含可打印字符。这就是为什么其他值给出明显随机字符的原因。

    您可以在插入时手动强制类型,或者您可以将 适配器 注册到 sqlite3 模块中:

    def adapt_int64(i):
        return int(i)
    
    sqlite3.register_adapter(np.int64, adapt_int64)
    

    之后,您可以安全地将 numpy.int64 值插入到您的 integer 列中。

    【讨论】:

      猜你喜欢
      • 2022-01-21
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 2012-05-12
      • 2022-11-13
      • 1970-01-01
      • 2010-12-26
      • 2016-07-30
      相关资源
      最近更新 更多