我正在尝试从访问数据库中获取表列表。脚本通过并显示了三分之一的表格,并收到以下错误:
trackback(最近的最新呼叫):file" 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()
如果表格元数据包含"描述",则几乎可以肯定是由cursor.columns()
的已知问题引起的。对于列。以下GitHub问题包括讨论问题和可能的解决方法:
https://github.com/mkleehammer/pyodbc/issues/328
tl; dr:访问ODBC驱动程序在这种情况下返回尾垃圾字节,并且字节的某些组合将不是有效的UTF-16LE编码字符。PYODBC输出转换器函数可用于拦截字节字符串并在不引发异常的情况下对其进行解码。这里描述了特定的解决方法:
https://github.com/mkleehammer/pyodbc/issues/328#issuecomment-419655266
感谢您的提示和反馈。我通过在列表中捕获信息然后打印结果,然后使用尝试语句处理错误并应用正确的Unicode来解决它。
您的建议将我指向正确的方向。
这是我的第一个答案,如果它非常通用,我深表歉意。
设置解码:
conn.setdecoding(pyodbc.SQL_WCHAR, encoding='latin-1')
将其放在conn.cursor()之前,您可能会缺少它:
conn_str = (
r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
r"DBQ=pathtoyouraccessdatabase.accdb;"
r"unicode_results=True;"
)
conn = pyodbc.connect(conn_str)
听起来您在某个地方的表名称中嵌入了一个Unicode(non-ascii)。弄清楚它停止的哪个表将确认是否是这种情况,但最终您希望Python脚本只处理Unicode,可以使用字符串decode
方法来完成unicode:
for fld in cursor2.columns(rows.table_name.decode('utf-16-le')):
这应该在任何地方都可以完成,有可能会出现Unicode字符(例如,列名称)。