UnicodeDecodeError:'utf-16-le'

Edd*_*pes 8 python ms-access odbc pyodbc utf-16le

我正在尝试从访问数据库中提取表列表。该脚本遍历并显示大约三分之一的表,并出现以下错误:

回溯(最近一次调用最后一次):文件“C:/GageInfo/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()
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 6

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


Pat*_*nes -1

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

for fld in cursor2.columns(rows.table_name.decode('utf-16-le')):
Run Code Online (Sandbox Code Playgroud)

这应该在任何可能出现 Unicode 字符的地方完成(例如,列名)。