2014-06-10 172 views
2

我试过两个模块,用于读取dbf文件(dbf和dbfpy),但我必须通过记录读取数据库记录来查找内容。这对于大型数据库来说确实很慢。是否有任何模块可以处理查询表或使用CDX索引?用python高效读取foxpro DBF

+0

根据您的平台,我想你可以尝试操作系统级别的外部接口,如ODBC/JDBC。 –

回答

2

我不相信dbfpy支持索引文件,而且我知道dbf没有。

然而,在dbf您可以创建一个临时索引,然后查询是:

big_table = dbf.Table('/path/to/some/big_table') 
def criteria(record): 
    "index the table using these fields" 
    return record.income, record.age 
index = big_table.create_index(key=criteria) 

index现在可以itereated过,或搜索返回所有匹配的记录:

for record in index.search(match=(50000, 30)): 
    print record 

样本表:

table = dbf.Table('tempu', 'name C(25); age N(3,0); income N(7,0);') 
table.open() 
for name, age, income in (
     ('Daniel', 33, 55000), 
     ('Mike', 59, 125000), 
     ('Sally', 33, 77000), 
     ('Cathy', 41, 50000), 
     ('Bob', 19, 22000), 
     ('Lisa', 19, 25000), 
     ('Nancy', 27, 50000), 
     ('Oscar', 41, 50000), 
     ('Peter', 41, 62000), 
     ('Tanya', 33, 125000), 
     ): 
    table.append((name, age, income)) 

index = table.create_index(lambda rec: (rec.age, rec.income)) 

还有碰到部门首长搜索范围的开头和结尾:

# all the incomes of those who are 33 
for rec in index.search(match=(33,), partial=True): 
    print repr(rec) 
print 
# all the incomes of those between the ages of 40 - 59, inclusive 
start = index.index_search(match=(40,), nearest=True) 
end = index.index_search(match=(60,), nearest=True) 
for rec in index[start:end]: 
    print repr(rec) 

它打印:

Daniel     33 55000 
Sally      33 77000 
Tanya      33 125000 

Cathy      41 50000 
Oscar      41 50000 
Peter      41 62000 
Mike      59 125000 
+0

这花了大约两倍的时间。我猜,因为它必须创建索引,然后通过它循环。 – user3727436

+0

@ user3727436:你能编辑你的答案并发布你试过的代码吗?创建索引会循环遍历整个表,但在此之后(使用适当的成语)查找应该使用二进制algorythm。 –