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

时间:2013-11-06 09:25:24

标签: python encoding pyodbc pypyodbc

我在连接到本地Access文件时遇到问题,该文件在路径和文件名中都带有重音字符。我是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',另一个打印完整文件名,但连接失败并出现以下错误:

  

异常UnicodeEncodeError:UnicodeEncodeError('ascii',u'DRIVER = {Microsoft Access Driver(* .mdb,* .accdb)}; DBQ = C:\ Users \ xxx \ case \ M \ xf8re \ M \ xf8reCase_v2。 accdb',121,122,'ordinal not in range(128)')被忽略

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

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

然后我得到以下错误:

  

追踪(最近一次通话):     文件“mwe.py”,第11行,in       cnxn = pyodbc.connect(dbConStr.encode('mbcs'))   UnicodeDecodeError:'ascii'编解码器无法解码121位的字节0xf8:ordina   l不在范围内(128)

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

更多信息:脚本文件保存为utf-8。 我使用的是挪威语'locales'的64位英语Windows 7。

提前致谢。

1 个答案:

答案 0 :(得分:2)

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

cnxn = pyodbc.connect(dbConStr)
     

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

似乎pyodbc尝试将连接字符串转换为'ascii',因此0x7F以上的任何字符都是 forbudt

但是,我能够使用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:\Users\Gord>\Python27\python.exe c:\__tmp\test\foo.py
c:\__tmp\test
M°reCase_v2.accdb
True
DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=c:\__tmp\test\M°reCase_v2.accdb
Connection established.