我有一个使用PyInstaller编译的应用程序,该应用程序使用sqlite数据库。一切正常,直到名称中包含特殊字符的用户运行该软件。甚至像这样简单的代码:
import sqlite3
path = "C:\\Users\\Jøen\\test.db"
db = sqlite3.connect(path)
追溯结果:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
sqlite3.OperationalError: unable to open database file
我尝试了各种组合,包括使用chardet
来检测编码,然后转换为UTF-8,但这也没有用。我所有常用的Python编码/解码技巧都让我失望了。
是否有人在Python中成功打开了一个在路径中有特殊字符的SQLite数据库?
因此,如果您的任何人在您的用户路径中都有国际或特殊字符,那么一些测试代码可能对我有所帮助:
import os
import sqlite3
path = os.path.expanduser("~")
sqlite3.connect(path + "\\test.db")
答案 0 :(得分:1)
我看到两个问题:
\t
是标签字符,\U
是8位十六进制Unicode字符转义的开头。sys.getfilesystemencoding()
,在Windows上通常是UTF-16(小端)或MBCS(多字节字符集) ,真正意义*我们支持的任何多字节编码,包括UTF-16),但不 UTF-8。或者只是传入一个Unicode字符串,让Python为你担心。在Python 2上,以下内容应该有效:
path = ur"C:\Users\Jøen\test.db"
这使用原始unicode字符串文字,这意味着它不会将\t
解释为选项卡,而是将两个单独的字符解释为b)生成一个Unicode字符串然后Python编码为正确的文件系统编码。
或者,在Windows上,正斜杠也可以作为分隔符,或者你可以双重反斜杠以正确地转义它们:
path = u"C:/Users/Jøen/test.db"
path = u"C:\\Users\\Jøen\\test.db"
在Python 3上,只需删除u
,然后不编码:
path = r"C:\Users\Jøen\test.db"
从主目录构建路径,在任何地方使用Unicode字符串,并使用os.path.join()
构建路径。不幸的是,{2}
} {3}}至于为什么)。你当然可以试试:
os.path.expanduser()
但是,依赖于检索环境变量的Unicode值将确保您获得未损坏的值;建立在bug 28171上,看起来像:
sys.getfilesystemencoding()
答案 1 :(得分:0)
我找到的方式实际上无需处理编码(我从未找到解决方案)就可以使用这里的答案:
How to get Windows short file name in python?
短名称似乎总是根据我的测试删除编码字符。我意识到这是一个kludge,但我找不到另一种方式。