部分(Python) dbf字段填充None.为什么?



在下面的代码中,我正在测试一些数字字段,但是正在抛出一个TypeError

import dbf
dbf_orders = dbf.Table('../../data/ORDERS.DBF')
idx_orders_OrDtTm = dbf_orders.create_index(lambda rec: str(rec.ODATE) + rec.OTIME.decode('utf-8') + formatRecNo(rec))
thisRec_Orders = idx_orders_OrDtTm.current_record
if thisRec_Orders['Received'] > 0 
and (thisRec_Orders['oTotal'] + thisRec_Orders['Change']) < thisRec_Orders['Received']:

Change字段的值为None,但数据类型为数字。Table.structure()的输出显示'CHANGE N(7,2) BINARY'

但是,Change字段的值并不总是None。大多数情况下,字段有一个数值。

,字符字段通常用二进制表示是很烦人的。

是否有一种方法可以获得数据类型的记录与有效的数据为他们的字段类型?我希望这是默认操作。

我不想在使用它之前检查每个字段的有效数据。当将current_record分配给变量时,我可以编写一个例程来修复数据类型和值,但我希望有更好的方法。

可以返回None的原因是可以让字段为空。例如,逻辑字段应该是TF,但也可以是' '(一个空格)。如果empty不是字段类型的有效值,则返回None(例如,除了空格是字符字段的有效值)。

这个问题的最佳解决方案是创建程序在字段中存储有效值。

下一个最好的解决方案是告诉dbf当字段中没有存储任何内容时,您想要哪种类型:

... = dbf.Table('...', default_data_types={'N': int, 'L':bool})

,并可能创建自己的函数来返回具有默认设置的表。


注意:default_data_types参数的规格为

{ data-type: python-type-for-any-or-no-value,
data-type: (python-type-for-any-value, python-type-for-no-value),
data-type: (python-type-for-any-value, python-type-for-no-value, python-type-for-null),
}

如果指定的三种类型少于所有三种类型,则使用最后一种类型填充三元组—因此'N': int'N': (int, int, int)相同,这意味着无论存储在字段中的是什么,都将返回int


注意:一些数据类型,如date.datedate.datetime没有empty/0的可能性,不带值调用它们会引发ValueErrorTypeError


注意:字段显示BINARY是因为它在dbf文件的字段头中设置了二进制标志。

最新更新