【问题标题】:UnicodeDecodeError when reading data from DBF database从 DBF 数据库读取数据时出现 UnicodeDecodeError
【发布时间】:2021-01-30 00:40:35
【问题描述】:

我需要编写一个脚本,将 ERP 程序连接到制造程序。有了生产程序,问题就很清楚了——我通过 HTTP 请求向它发送数据。 ERP 程序的情况更糟,因为在这种情况下,必须从 DBF 文件中读取数据。

我使用 dbf 库是因为(如果我没记错的话)它是唯一能够以相当简单和快速的方式过滤数据的库。我这样打开数据库

table = dbf.Table(path).open()
dbf_index = dbf.pql(table, "select * where ident == 'M'")

然后我循环遍历查询返回的每个连续记录。我需要将 DBF 数据库中选择的数据“打包”成 json 并发送到生产程序 api。

data = {
    "warehouse_id" : parseDbfData(record['SYMBOL']),
    "code" : parseDbfData(record['SYMBOL']),
    "name" : parseDbfData(record['NAZWA']),
    "main_warehouse" : False,
    "blocked" : False
}

parseDbfData 函数看起来像这样,但它不是导致问题的原因,因为没有它它就不能以同样的方式工作。我添加它是为了解决问题。

def parseDbfData(data):
    return str(data.strip())

在运行时,如果函数遇到来自 DBF 数据库的任何“不匹配”字符(例如任何波兰字符,即 ą、ę、ś、ć),则脚本会因错误而终止

UnicodeDecodeError: 'ascii' codec can't decode byte 0x88 in position 15: ordinal not in range(128)

错误指向包含此的行(在构建 json 中)

"name" : parseDbfData(record['NAZWA']),

此时脚本试图读取的值可能是“Magazyn materiałów Podgórna”。如您所见,该值包含字符“ł”和“ó”。我认为这会使整个脚本中断,但我不知道如何修复它。

我会提到我使用的是 Python 3.9 版。我知道版本 2. 中存在字符编码问题,但我认为 Python 3. 时代已经解决了这个问题。我发现它没有:(

【问题讨论】:

  • 是的,当我把print("Python version: " + str(sys.version_info[0]))放在开头时,我得到Python version: 3

标签: python python-3.x dbf python-3.9


【解决方案1】:

我得出的结论是在读取DBF数据库的时候必须直接使用encoding。但是,我无法从文档中阅读,究竟如何做到这一点。

经过对dbf模块本身的深入分析,得出的结论是打开数据库时需要用到codepage参数。结合片刻,我能够确定在模块中可用的所有编码标准中,cp852 最适合我。

修正后,打开DBF数据库的代码如下:

table = dbf.Table(path, codepage='cp852').open()

【讨论】:

    【解决方案2】:

    Python 3 确实修复了 unicode/bytes 问题,但仅针对 Python 本身。 dbf 格式存储应该在 .dbf 文件本身内部使用的代码页(这通常不这样做,导致使用 ascii 编解码器)。

    修复 dbf 文件(可能会弄乱使用它们的其他程序,因此请仔细测试):

    table.open()
    table.codepage = dbf.CodePage('cp852')
    table.close()
    

    【讨论】:

      猜你喜欢
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多