Visual Fox Pro与Python

3 投票
2 回答
2511 浏览
提问于 2025-04-16 14:21

我正在使用一个叫做Visual Fox Pro的数据库(.dbf文件),并且我在用一个叫做dbf的Python模块。这里有个例子:

myDb = VfpTable('table.dbf');

现在我可以通过以下方式排除已删除的项目:

myDb._use_deleted = None; 

我想问的是,有没有更简单的方法来做到这一点?比如说,是否有一个函数可以使用?我不喜欢访问“私有”变量。此外,如果不设置这个属性,我该如何判断一行数据是否被删除了?因为它们在技术上仍然在数据库里,所以有没有什么标记?或者隐藏的列?也许有更了解这个Python模块或Visual Fox Pro的人能给我一些建议。

2 个回答

4

使用上面提到的 dbf 模块,你想要做的是:

myDB.use_deleted = False

对于每一条记录:

for record in myDB:
    if record.has_been_deleted:
        print "record %d is marked for deletion!" % record.record_number

要从表格中实际删除这些记录:

myDB.pack()

声明:我是这个模块的作者。

0

如果你听过这个故事,请打断我:"""我有一个用来读取DBF文件的模块(叫pydbfrw),我一直想“哪天”把它发布出来。"""

其实,添加你想要的功能比去琢磨dbf模块的源代码要简单得多:

>>> import pydbfrw
>>> d = pydbfrw.DBFreader('/devel/dbf/all_files/del.dbf')
>>> list(d)
[['fred', 1], ['harriet', 4]]
>>> d.get_field_names()
['NAME', 'AMT']
>>> d = pydbfrw.DBFreader('/devel/dbf/all_files/del.dbf', include_deleted=True)
>>> list(d)
[[False, 'fred', 1], [True, 'tom', 2], [True, 'dick', 3], [False, 'harriet', 4]]
>>> d.get_field_names()
['deleted__', 'NAME', 'AMT']
>>> for rowdict in d.get_dicts():
...     print rowdict
...
{'deleted__': False, 'name': 'fred', 'amt': 1}
{'deleted__': True, 'name': 'tom', 'amt': 2}
{'deleted__': True, 'name': 'dick', 'amt': 3}
{'deleted__': False, 'name': 'harriet', 'amt': 4}
>>> for rowtup in d.get_namedtuples():
...     print rowtup
...
Row(deleted__=False, name='fred', amt=1)
Row(deleted__=True, name='tom', amt=2)
Row(deleted__=True, name='dick', amt=3)
Row(deleted__=False, name='harriet', amt=4)
>>>

撰写回答