6

我正在尝试从访问数据库中提取表列表。该脚本通过并显示大约三分之一的表并收到以下错误:

回溯(最后一次调用):文件“C:/GageInfo/sourcecode for GageTrakNotify/__test script.py”,第 31 行,在 cursor2.columns(rows.table_name)中的 fld:UnicodeDecodeError:'utf-16-le'编解码器无法解码位置 132-133 中的字节:非法编码

任何提示将不胜感激。

import pyodbc


cursor1 = conn.cursor()
cursor2 = conn.cursor()

tblCount = 0
for rows in cursor1.tables():
   if rows.table_type == "TABLE":
       tblCount += 1
       print(rows.table_name)
       for fld in cursor2.columns(rows.table_name):
           print(fld.table_name, fld.column_name)

conn.close()
4

3 回答 3

2

cursor.columns()如果表元数据包含列的“描述”,这几乎肯定是由使用 Access ODBC 驱动程序时的一个已知问题引起的。以下 GitHub 问题包括对问题和可能的解决方法的讨论:

https://github.com/mkleehammer/pyodbc/issues/328

TL;DR:Access ODBC 驱动程序在这些情况下返回尾随垃圾字节,并且这些字节的某些组合将不是有效的 UTF-16LE 编码字符。可以使用 pyodbc 输出转换器函数来截取字节字符串并对其进行解码,而不会引发异常。此处描述了具体的解决方法:

https://github.com/mkleehammer/pyodbc/issues/328#issuecomment-419655266

于 2021-08-01T23:19:11.303 回答
0

感谢您的提示和反馈。我通过捕获列表中的信息然后打印出结果来解决它,并使用 try 语句来处理错误并应用正确的 unicode。

您的建议为我指明了正确的方向。

于 2017-12-06T16:31:21.757 回答
-1

听起来您在某处的表名中嵌入了 Unicode(非 ASCII)。弄清楚它在哪个表上停止将确认是否是这种情况,但最终您希望 Python 脚本只处理 Unicode,这可以通过 stringdecode方法完成:

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

这应该在可能出现 Unicode 字符的任何地方进行(例如,列名也是如此)。

于 2017-12-05T17:30:36.093 回答