Python 'utf-16-le' 从MS Access数据库表中获取列时出错。

问题描述 投票:0回答:1

我收到以下错误。

 UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 372-373: illegal UTF-16 surrogate

这段代码只是有时出现,我不明白为什么。 代码所做的是在文件路径中循环,抓取Access数据库,然后获取表 "mytablename "中存在的列,这些列没有任何特殊字符。

 filepathlocation = '//testfilepath'
 access_driver = datasources['MS Access Database']


for filename in os.listdir(filepathlocation):
     if filepathlocation.endswith(".mdb"): 

         fullfilepath = os.path.join(filepathlocation, filename)
         accessConn = pyodbc.connect(driver = access_driver, dbq = fullfilepath)
         accessCur = accessILIConn.cursor()

        for row in accessCur.columns(table='myTableName'):
             accesscolumnnames = accesscolumnnames + row.column_name + ';'

        print(accesscolumnnames)

我确实在另一个帖子中看到了这样的用法。

for fld in cursor2.columns(rows.table_name.decode('utf-16-le')):

我不知道如何改变我的代码来遵循这个。我试着添加了

for row in accessCur.columns(table='myTableName'.decode('utf-16-le')):

我是python新手,所以我知道我的语法不正确。

所以我最后把代码改成了下面的,这样就可以了。

    sqlColumns = 'SELECT * FROM Mytable where 1=0;'
    res = accessCur.execute(sqlColumns)
    columnlist = [tuple[0] for tuple in res.description]
    columnnames = ';'.join(columnlist) + ';'
python pyodbc
1个回答
0
投票

这是微软Access ODBC驱动的一个已知问题,在这里有文档说明。

https:/github.comkleehammerpyodbcissues328。

你可以使用一个输出转换器函数来解决这个问题。

def decode_sketchy_utf16(raw_bytes):
    s = raw_bytes.decode("utf-16le", "ignore")
    try:
        n = s.index('\u0000')
        s = s[:n]  # respect null terminator
    except ValueError:
        pass
    return s

# ...

prev_converter = cnxn.get_output_converter(pyodbc.SQL_WVARCHAR)
cnxn.add_output_converter(pyodbc.SQL_WVARCHAR, decode_sketchy_utf16)
col_info = crsr.columns("Clients").fetchall()
cnxn.add_output_converter(pyodbc.SQL_WVARCHAR, prev_converter)  # restore previous behaviour
© www.soinside.com 2019 - 2024. All rights reserved.