Python sqlite3连接路径中的特殊字符

时间:2016-03-06 21:50:27

标签: python python-2.7 sqlite

我有一个使用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")

2 个答案:

答案 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,但我找不到另一种方式。