【问题标题】:UnicodeDecodeError: 'utf-16-le'UnicodeDecodeError: 'utf-16-le'
【发布时间】:2018-05-18 14:50:50
【问题描述】:

我正在尝试从 access 数据库中提取表列表。该脚本遍历并显示了大约三分之一的表并得到以下错误:

Traceback(最近一次调用最后一次):文件“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()

【问题讨论】:

  • 使用当前代码的输出来识别最后一次成功打印,然后在 Access 本身中打开数据库并在设计视图中检查表以确定导致打印的列名(或表名)错误。然后,edit 你的问题向我们展示它是什么。

标签: python ms-access odbc pyodbc utf-16le


【解决方案1】:

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

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

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

【讨论】:

  • 表/列名中的Unicode字符本身不是问题。我刚刚在 Python 3.6 下测试了 pyodbc 4.0.21,问题中的代码使用 Access 2010 ODBC 驱动程序正确打印了列名[pile of ?]。 (表情符号在 BMP 之外,因此证明 ODBC 驱动程序和 pyodbc 可以处理 UTF-16 代理对。)
  • 同意,@GordThompson。 print 语句(现在是 Python 3 中的函数)可以处理它,我认为这就是他的代码中的 print(rows.table_name) 运行良好的原因。我所经历的是,有时与导入模块关联的对象(及其附带的方法)无法处理 Unicode 编码,我认为这可能就是 cursor2.columns(rows.table_name) 出错的原因。我最近在一个用于写入 Excel 文件的模块中遇到了这个问题:除非我首先将 decode 应用于我正在编写的内容,否则它不会让我写。
  • 我已经尝试过了,但收到一个错误,即对象没有属性“解码”。
  • 您是否能够识别出发生错误的表?
  • @EddieSnipes - 您可能需要使用更多详细信息编辑您的问题,例如 Python2 或 Python3、数据库文件的类型(.mdb 或 .accdb)、您使用的 Access ODBC 驱动程序、版本您正在使用的 pyodbc。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    这几乎肯定是由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

    【讨论】:

      猜你喜欢
      • 2019-02-21
      • 2015-07-14
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 2013-08-16
      相关资源
      最近更新 更多