【问题标题】:Python DBF: How to associate a .cdx index with a .dbf tablePython DBF:如何将 .cdx 索引与 .dbf 表关联
【发布时间】:2018-05-30 23:40:52
【问题描述】:

我接到了一项模糊的任务,即从各种 Visual FoxPro 表中自动提取数据。

有几对.DBF.CDX 文件。使用 Python dbf 包,我似乎能够使用它们。我有两个文件,一个ABC.DBF 和一个ABC.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 author, dbf 可以读取索引:

我可以读取 IDX 文件,但不能更新它们。我的日常工作改变了,dbf 文件不是新文件的很大一部分。 – 伊桑·弗曼 2016 年 5 月 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 表?

【问题讨论】:

  • .idx 和 .cdx 是不一样的,并且在其中保留了多个索引“标签”。当 .cdx 与 .dbf 文件同名时,称为“结构索引”并自动更新,在需要时使用。如果你的 dbf 没有做低级别的事情,那么你真的不需要做一些特别的事情。否则也许你可以找到一个通过 OleDb 连接的库(也可以查看 Dabo dev,开发人员来自 VFP 社区)。

标签: python visual-foxpro dbf


【解决方案1】:

.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:
    ...

【讨论】:

  • 活跃变量是什么鬼,它是从哪里来的?
  • @joash:在上面的代码中,active 不是变量,它是table.create_index 用于过滤记录的函数(刚刚定义)的名称。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多