Python DBF 模块正在向表导出添加额外的行

标签 python database sqlite dbf

我正在将 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/

相关文章:

mysql - 完全外连接中的语法错误?

sql - sp_send_dbmail 中的 HTML 格式

sql - 选择与联结表中的许多其他ID有关系的记录

python - Django NoReverseMatch : trying to get slug in a template

python - 带有 python 的 selenium remotewebdriver-性能日志记录?

python - 将 Tkinter UI 问题与 Python 应用程序中的逻辑分开

python - Facepy 无法将图像上传到 Facebook

java - 我在 DAO 中为具体查询创建 AsynchTask 时遇到问题

android - 在android中的sqlite中使用更新语句

java - hibernate 错误 "database is locked"。我如何正确关闭 session ?