【发布时间】:2012-11-15 10:40:28
【问题描述】:
我正在将 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 文档,我什至查看了代码,但在它的迷雾中,它一定已经溜走了。感谢一百万的解决方案和帮助。
【问题讨论】:
-
另外,Open Office 中的一个错误会阻止读取这些行,或者它们无法正确编码到 CSV 文件,或者 sqlite .import 语句没有从 CSV 正确读取它们。
-
也有可能,但我也在 xBaseView Dbf Viewer 和其他软件中查看了该文件,但其他行不存在。这对我来说很奇怪。看来模块一定不能正确读取文件。我尝试了 Ethan Furlong 为 python 编写的更新的 dbf 0.94.005 模块,但它对我不起作用,它不断抛出错误,甚至无法打开文件。
-
如果您有可能在 MS Windows 上运行该脚本,并且您正在使用的特定 DBF 方言存在 ODBC 驱动程序(例如想到 Visual FoxPro)我建议使用pyodbc 可能是更强大的解决方案。
标签: python database sqlite dbf