Python pyodbc: кодировка строки подключения (Windows)

У меня проблема с подключением к локальному файлу 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 (*.mdb, *.accdb)};DBQ=C:\Users\xxx\case\M\xf8re\M\xf8reCase_v2.accdb', 121, 122, "порядковый номер не в диапазоне (128)" в игнорируется

Я пытался декодировать строку подключения обратно в системную кодировку

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

но тогда я получаю следующую ошибку:

Traceback (последний вызов был последним): файл "mwe.py", строка 11, в cnxn = pyodbc.connect(dbConStr.encode('mbcs')) UnicodeDecodeError: кодек "ascii" не может декодировать байт 0xf8 в позиции 121: Ордина л не в радиусе (128)

Я пробовал также 'cp1252' и 'utf-8', но выдает ту же ошибку (в utf-8 отличается только код символа).

Больше информации: файл скрипта сохраняется как utf-8. Я на 64-битной английской Windows 7 с норвежскими "локалями".

Заранее спасибо.

1 ответ

Решение

Мне не удалось заставить ваш тестовый пример работать с использованием pyodbc. Я мог правильно собрать строку подключения, но когда я попытался подключиться, я получил сообщение об ошибке

cnxn = pyodbc.connect(dbConStr)

UnicodeDecodeError: кодек "ascii" не может декодировать байт 0xf8 в позиции 69: порядковый номер не в диапазоне (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:\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.
Другие вопросы по тегам