13

我目前出于自己的目的将文件名保存在 sqlite 数据库中。每当我尝试插入具有特殊字符(如 é 等)的文件时,它都会引发以下错误:

pysqlite2.dbapi2.ProgrammingError: You must not use 8-bit bytestrings unless you use a text_factory that can interpret 8-bit bytestrings (like text_factory = str). It is highly recommended that you instead just switch your application to Unicode strings.

当我通过使用 unicode 方法包装发送到 pysqlite 的值来“将我的应用程序切换到 Unicode 字符串”时unicode(filename),它会引发此错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 66: ordinal not in range(128)

我能做些什么来摆脱这个吗?修改我的所有文件以符合要求不是一种选择。

更新 如果我通过解码文本filename.decode("utf-8"),我仍然得到上面的 ProgrammingError。

我的实际代码如下所示:

cursor.execute("select * from musiclibrary where absolutepath = ?;",
    [filename.decode("utf-8")])

我的代码应该是什么样的?

4

5 回答 5

14

您需要指定filename转换为 Unicode 的编码,例如:filename.decode('utf-8'). 仅使用unicode(...)选择控制台编码,这通常是不可靠的(而且经常是ascii)。

于 2010-05-14T22:47:09.163 回答
3

您应该将 SQL 语句的参数作为 Unicode 传递。

现在,这完全取决于您如何获取文件名列表。也许您正在使用os.listdiror读取文件系统os.walk?如果是这种情况,有一种方法可以直接将文件名作为 Unicode,只需将 Unicode 参数传递给以下任一函数:
示例:

  • os.listdir(u'.')
  • os.walk(u'.')

当然,您可以将u'.'目录替换为您正在阅读其内容的实际目录。只要确保它是一个 Unicode 字符串。

于 2010-06-10T13:43:37.353 回答
1

你已经想通了,但是:

正如问题当前所述,我认为您实际上无法从 cursor.execute("select * from musiclibrary where absolutepath = ?;", [filename.decode("utf-8")]) 中获得 ProgrammingError 异常。

要么 utf-8 解码会爆炸,要么 cursor.execute 调用会对结果感到满意。

于 2011-01-11T05:23:00.380 回答
1

您是否尝试过直接传递 unicode 字符串:

cursor.execute("select * from musiclibrary where absolutepath = ?;",(u'namé',))

您需要在脚本的开头添加文件编码:

# coding: utf-8
于 2010-05-15T00:25:38.647 回答
-1

尝试更改为:

cursor.execute("select * from musiclibrary where absolutepath = ?;",
    [unicode(filename,'utf8')])

在您的文件名来源中不使用 编码utf8,更改utf8为您的编码。

于 2017-08-19T03:19:43.573 回答