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

2024-10-03 04:28:24 发布

您现在位置:Python中文网/ 问答频道 /正文

连接到路径和文件名中都有重音字符的本地访问文件时出现问题。我是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)};DBQ=C:\Users\xxx\case\M\xf8re\M\xf8reCase_v2.accdb', 121, 122, 'ordinal not in range(128)') in ignored

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

^{pr2}$

但是我得到了以下错误:

Traceback (most recent call last): File "mwe.py", line 11, in cnxn = pyodbc.connect(dbConStr.encode('mbcs')) UnicodeDecodeError: 'ascii' codec can't decode byte 0xf8 in position 121: ordina l not in range(128)

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

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

提前谢谢。在


Tags: 文件pathinimportos文件名错误字符
1条回答
网友
1楼 · 发布于 2024-10-03 04:28:24

更新-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让您的测试用例正常工作。我可以正确地组装连接字符串,但是当我尝试连接时,我收到了错误消息

^{bq}$

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

但是,我可以使用pypyodbc使其正常工作:

^{pr2}$

输出:

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.

相关问题 更多 >