我在连接到本地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。
提前致谢。
答案 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.