从 DBF 数据库读取数据时出现 UnicodeDecodeError
UnicodeDecodeError when reading data from DBF database
我需要编写一个脚本,将 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. 时代已经解决了这个问题。我发现它没有:(
我得出的结论是读取DBF数据库必须直接使用encoding。但是,我无法从文档中读取具体如何执行此操作。
深入分析了dbf模块本身,得出的结论是打开数据库时需要使用codepage参数。结合了一下,我能够确定模块中所有可用的编码标准,cp852 最适合我。
修改后打开DBF数据库的代码如下:
table = dbf.Table(path, codepage='cp852').open()
Python 3 确实修复了 unicode/bytes 问题,但仅针对 Python 本身。 dbf
格式存储应在 .dbf
文件内部使用的代码页(通常不这样做,导致使用 ascii
编解码器)。
要修复 dbf 文件(这可能会弄乱其他使用它们的程序,因此请仔细测试):
table.open()
table.codepage = dbf.CodePage('cp852')
table.close()
我需要编写一个脚本,将 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. 时代已经解决了这个问题。我发现它没有:(
我得出的结论是读取DBF数据库必须直接使用encoding。但是,我无法从文档中读取具体如何执行此操作。
深入分析了dbf模块本身,得出的结论是打开数据库时需要使用codepage参数。结合了一下,我能够确定模块中所有可用的编码标准,cp852 最适合我。
修改后打开DBF数据库的代码如下:
table = dbf.Table(path, codepage='cp852').open()
Python 3 确实修复了 unicode/bytes 问题,但仅针对 Python 本身。 dbf
格式存储应在 .dbf
文件内部使用的代码页(通常不这样做,导致使用 ascii
编解码器)。
要修复 dbf 文件(这可能会弄乱其他使用它们的程序,因此请仔细测试):
table.open()
table.codepage = dbf.CodePage('cp852')
table.close()