Python DBF:如何将.cdx索引与.dbf表

时间:2018-05-30 23:40:52

标签: python visual-foxpro dbf

我被赋予了一个模糊的任务,即自动从各种Visual FoxPro表中提取数据。

有几对.DBF.CDX个文件。使用Python dbf包,我似乎能够使用它们。我有两个文件,ABC.DBFABC.CDX。我可以使用

加载表文件
>>> import dbf
>>> table = dbf.Table('ABC.DBF')
>>> print(table[3])
  0 - table_key : '\x00\x00\x04'
  1 - field_1   : -1
  2 - field_2   : 0
  3 - field_3   : 34
  4 - field_ 4  : 2
  ...

>>>

我的理解是.cdx文件是索引。我怀疑它对应于table_key字段。 According to the authordbf可以读取索引:

  

我可以读取IDX文件,但不能更新它们。我的日常工作变了,dbf   文件不是新文件的重要组成部分。 - 伊桑弗曼16年6月26日   在21:05

阅读就是我需要做的。我看到存在四个类,IdxIndexIndexFileIndexLocation。这些似乎是很好的候选人。

Idx类读入表和文件名,这很有希望。

>>> index = dbf.Idx(table, 'ABC.CDX')
但是,我不确定如何使用这个对象。我看到它有一些生成器,backwardforward,但是当我尝试使用它们时出现错误

>>> print(list(index.forward()))
dbf.NotFoundError: 'Record 67305477 is not in table ABC.DBF'

如何将.cdx索引文件与.dbf表关联?

1 个答案:

答案 0 :(得分:2)

.idx.cdx不一样,dbf目前无法读取.cdx个文件。

如果需要对表进行排序,可以创建内存索引:

my_index = table.create_index(key=lambda r: r.table_key)

您还可以创建一个完整的功能:

def active(rec):
    # do not show deleted records
    if is_deleted(rec):
        return DoNotIndex
    return rec.table_key

my_index = table.create_index(active)

然后遍历索引而不是表:

for record in my_index:
    ...