1

我正在将 dbf 文件批量导入到 sqlite。我使用http://dbfpy.sourceforge.net/的 dbf 模块在 python 中编写了一个简单的脚本。除了少数情况外,它工作正常且符合预期。在一些非常谨慎的情况下,该模块似乎在它正在读取的表中添加了一些错误记录。

我知道这听起来很疯狂,但似乎确实如此。我已经使用 open office 将有问题的 dbase 文件导出到 csv 并使用 .import 将其直接导入到 sqlite 并且不存在 3 个额外记录。

但是,如果我使用 python 和 dbfpy 模块遍历文件,则会添加 3 条额外记录。

我想知道这三个记录是否有可能在 dbf 文件中被标记为已删除,而 dbf 模块正在拾取打开办公室不可见的情况。在这种可能性中,我可能会走得很远,但我真的在这个问题上摸不着头脑。

任何帮助表示赞赏。

以下是我读取 dbf 文件的方法示例。我已经删除了循环并使用了一个案例。

conn = lite.connect('../data/my_dbf.db3')
#used to get rid of the 8 byte string error from sqlite3
conn.text_factory = str
cur = conn.cursor()
rows_list = []
db = dbf.Dbf("../data/test.dbf")         
for rec in db:
    ***if not rec.deleted:***
          row_tuple = (rec["name"], rec["address"], rec["age"])
          rows_list.append(row_tuple)

print file_name + " processed"
db.close()
cur.executemany("INSERT INTO exported_data VALUES(?, ?, ?)", rows_list)

#pprint.pprint(rows_list)
conn.commit()

解决方案 好吧,在午餐前又进行了大约半小时的测试后,我发现我可能的假设实际上是正确的,有些文件没有被打包,因此标记为删除的记录仍然保留在其中。它们在出口后不应该处于未包装状态,因此会造成更多混乱。我手动打包了一个文件并对其进行了测试,它立即返回了正确的结果。

非常感谢您对此的帮助。我在下面给出的解决方案中添加了忽略已删除的记录。我在这个模块中搜索并搜索了这个方法(已删除),但找不到它的 api 文档,我什至查看了代码,但在它的迷雾中,它一定已经溜走了。感谢一百万的解决方案和帮助。

4

1 回答 1

1

如果您不想丢弃标记为已删除的记录,您可以编写:

for rec in db:
    if not rec.deleted:
        row_tuple = (rec["name"], rec["address"], rec["age"])
        rows_list.append(row_tuple)
于 2012-11-15T13:29:14.953 回答