我正在将 dbf 文件批量导入到 sqlite。我使用 dbf 模块在 python 中编写了一个简单的脚本 http://dbfpy.sourceforge.net/ 。除了少数情况外,它工作正常并且符合预期。在非常谨慎的情况下,模块似乎在它正在读取的表中添加了一些错误的记录。
我知道这听起来很疯狂,但事实似乎确实如此。我已使用 open office 将有问题的 dbase 文件导出到 csv,并使用 .import 将其直接导入到 sqlite,并且 3 个额外记录不存在。
但是如果我使用 python 和 dbfpy 模块迭代该文件,则会添加 3 条额外记录。
我想知道这三个记录是否有可能在 dbf 文件中被标记为已删除,并且虽然对 open office 不可见,但却被 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 文档,我什至查看了代码,但在这一切的迷雾中它一定已经溜走了。感谢一百万的解决方案和帮助人员。
最佳答案
如果您不想丢弃标记为已删除的记录,您可以编写:
for rec in db:
if not rec.deleted:
row_tuple = (rec["name"], rec["address"], rec["age"])
rows_list.append(row_tuple)
关于Python DBF 模块正在向表导出添加额外的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13395783/