1

我在连接到路径和文件名中都有重音字符的本地 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, '序数不在范围 (128)') 中被忽略

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

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

但后来我收到以下错误:

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

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

更多信息:脚本文件保存为 utf-8。我在使用挪威语“语言环境”的 64 位英语 Windows 7 上。

提前致谢。

4

1 回答 1

3

更新 - 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\\M\xf8reCase_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 以上的任何字符都是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.
于 2013-11-08T08:54:52.297 回答