Python pyodbc:连接字符串的编码(Windows)



我在连接到路径和文件名中都有重音字符的本地访问文件时遇到问题。我是 Python 的新手,所以这是我到目前为止所管理的:

# coding=utf-8
from __future__ import absolute_import, division, print_function, unicode_literals
import os
import pyodbc
scriptDir = os.path.dirname(os.path.realpath(__file__)).decode('mbcs')
dbRelPath = "MøreCase_v2.accdb"
dbAbsPath = scriptDir + '\' + dbRelPath
print (os.path.exists(dbAbsPath))
dbConStr = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + dbAbsPath
print (dbConStr)
cnxn = pyodbc.connect(dbConStr)

第一次打印返回"True",另一个打印打印完整的文件名,但连接失败并显示以下错误:

Exception UnicodeEncodeError: UnicodeEncodeError('ascii', u'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};D BQ=C:\Users\xxx\case\M\xf8re\M\xf8reCase_v2.accdb', 121, 122, 'ordinal not in range(128)') in ignore

我尝试将连接字符串解码回系统编码

cnxn = pyodbc.connect(dbConStr.encode('mbcs'))

但随后我收到以下错误:

回溯(最近一次调用): 文件 "mwe.py",第 11 行,在 cnxn = pyodbc.connect(dbConStr.encode('mbcs')) UnicodeDecodeError:"ascii"编解码器无法解码位置 121 中的字节0xf8:ordina l 不在范围内(128)

我也尝试了"cp1252"和"utf-8",但它给出了相同的错误(只有 utf-8 中的字符代码不同)。

详细信息:脚本文件另存为 utf-8。我使用的是带有挪威语"语言环境"的 64 位英语 Windows 7。

提前谢谢。

更新 - 2019 年 7 月

对于当前版本的 pyodbc,这不再是问题。以下代码工作正常:

# -*- coding: utf-8 -*-
import os
import pyodbc
import sys
print(sys.version)
# 2.7.16 (v2.7.16:413a49145e, Mar  4 2019, 01:30:55) [MSC v.1500 32 bit (Intel)]
print(pyodbc.version)
# 4.0.26
script_dir = os.path.dirname(os.path.realpath(__file__))
db_relative_path = u"MøreCase_v2.accdb"
db_absolute_path = script_dir + '\' + db_relative_path
print(repr(db_absolute_path))
# u'C:\Users\gord\PycharmProjects\py2pyodbc_test\Mxf8reCase_v2.accdb'
print('File exists? ' + str(os.path.exists(db_absolute_path)))
# File exists? True
connection_string = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + db_absolute_path
cnxn = pyodbc.connect(connection_string)
print('Connection established.')
# Connection established.


(以前的答案 - 2013 年 11 月)

我无法使用 pyodbc 让您的测试用例工作。我可以正确组装连接字符串,但是当我尝试连接时,我收到错误消息

cnxn = pyodbc.connect(dbConStr)

UnicodeDecodeError:"ascii"编解码器无法解码位置 69 中的字节0xf8:序号不在范围内(128)

看起来 pyodbc 试图将连接字符串转换为 'ascii' ,因此0x7F上面的任何字符都被禁止

但是,我能够使用 pypyodbc 让它工作:

# -*- coding: cp1252 -*-
import os
import pypyodbc
scriptDir = os.path.dirname(os.path.realpath(__file__))
print scriptDir
dbRelPath = "MøreCase_v2.accdb"
print dbRelPath
dbAbsPath = scriptDir + '\' + dbRelPath
print (os.path.exists(dbAbsPath))
dbConStr = "DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + dbAbsPath
print (dbConStr)
cnxn = pypyodbc.connect(dbConStr)
print 'Connection established.'

输出:

C:UsersGord>Python27python.exe c:__tmptestfoo.py
c:__tmptest
M°reCase_v2.accdb
True
DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=c:__tmptestM°reCase_v2.accdb
Connection established.