我目前在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方法(例如:unicode(filename)
)将发送到pysqlite的值包装“切换到Unicode字符串”时,会抛出此错误:
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")])
我的代码应该是什么样的?
答案 0 :(得分:14)
您需要指定filename
的编码以转换为Unicode,例如:filename.decode('utf-8')
。只需使用unicode(...)
选择控制台编码,这通常是不可靠的(通常是ascii
)。
答案 1 :(得分:3)
您应该以Unicode的形式传递SQL语句的参数。
现在,这一切都取决于如何获取文件名列表。也许您正在使用os.listdir
或os.walk
阅读文件系统?如果是这种情况,只需将Unicode参数传递给这些函数中的任何一个,就可以直接将文件名作为Unicode:
例子:
os.listdir(u'.')
os.walk(u'.')
当然,您可以将u'.'
目录替换为您正在阅读其内容的实际目录。只需确保它是一个Unicode字符串。
答案 2 :(得分:1)
您是否尝试过直接传递unicode字符串:
cursor.execute("select * from musiclibrary where absolutepath = ?;",(u'namé',))
您需要在脚本开头添加文件编码:
# coding: utf-8
答案 3 :(得分:1)
你已经想到了这一点,但是:
我认为你实际上不能从cursor.execute获取那个ProgrammingError异常(“select * from musiclibrary where absolutepath =?;”,[filename.decode(“utf-8”)]),作为当前的问题的状态。
utf-8解码会爆炸,或者cursor.execute调用会对结果感到满意。
答案 4 :(得分:-1)
尝试更改为:
cursor.execute("select * from musiclibrary where absolutepath = ?;",
[unicode(filename,'utf8')])
在您的文件名中,来源不会使用utf8
进行编码,请将utf8
更改为您的编码。