我正在做一個批量導入dbf文件到sqlite。我在http://dbfpy.sourceforge.net/上使用dbf模塊在python中編寫了一個簡單的腳本。它工作正常,並且如預期的那樣,除少數情況外。在非常謹慎的情況下,該模塊似乎在它正在閱讀的表格中添加了一些錯誤的記錄。Python DBF模塊添加額外的行到表導出
我知道這聽起來很瘋狂,但它確實似乎是這樣。我已經使用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文檔,我甚至在代碼中查看,但是在它的迷霧中,它一定已經滑落了。感謝百萬的解決方案並幫助他們。
另外,在開放式辦公室中的錯誤可以防止這些行被讀取,或者他們不能正確編碼的CSV文件,或它們沒有被正確的從sqlite .import語句的CSV中讀取。 –
也是一種可能性,但我也在xBaseView Dbf Viewer和其他軟件中查看了該文件,其他行不在那裏。它對我來說很奇怪。看來模塊不能正確讀取文件。我嘗試了由Ethan Furlong創建的最新的dbf 0.94.005模塊,但它不適用於我,它在錯誤之後不斷拋出錯誤,甚至不會打開文件。 – jiraiya
如果您有可能在MS Windows上運行腳本,並且您正在使用的特定DBF方言存在ODBC驅動程序(例如想到_Visual FoxPro_),我會建議使用[pyodbc](http://pypi.python .org/pypi/pyodbc)可能會是更強大的解決方案。 –