【问题标题】:Python pyodbc: encoding of the connection string (Windows)Python pyodbc:连接字符串的编码(Windows)
【发布时间】:2013-11-06 09:25:24
【问题描述】:

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

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)') 被忽略

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

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

但后来我收到以下错误:

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

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

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

提前致谢。

【问题讨论】:

    标签: python encoding pyodbc pypyodbc


    【解决方案1】:

    更新 - 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.
    

    【讨论】:

    • 谢谢,我不知道 pypyodbc。我可以确认它也适用于我,所以我接受这个答案。
    • 我非常爱你,1 周的问题解决了,repr() 解决了...哇
    猜你喜欢
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多