我收到以下错误。
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) + ';'
这是微软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