2012-11-15 42 views
1

我正在做一個批量導入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文檔,我甚至在代碼中查看,但是在它的迷霧中,它一定已經滑落了。感謝百萬的解決方案並幫助他們。

+0

另外,在開放式辦公室中的錯誤可以防止這些行被讀取,或者他們不能正確編碼的CSV文件,或它們沒有被正確的從sqlite .import語句的CSV中讀取。 –

+0

也是一種可能性,但我也在xBaseView Dbf Viewer和其他軟件中查看了該文件,其他行不在那裏。它對我來說很奇怪。看來模塊不能正確讀取文件。我嘗試了由Ethan Furlong創建的最新的dbf 0.94.005模塊,但它不適用於我,它在錯誤之後不斷拋出錯誤,甚至不會打開文件。 – jiraiya

+0

如果您有可能在MS Windows上運行腳本,並且您正在使用的特定DBF方言存在ODBC驅動程序(例如想到_Visual FoxPro_),我會建議使用[pyodbc](http://pypi.python .org/pypi/pyodbc)可能會是更強大的解決方案。 –

回答

1

如果你不會丟棄標記爲刪除的記錄,你可以寫:

for rec in db: 
    if not rec.deleted: 
     row_tuple = (rec["name"], rec["address"], rec["age"]) 
     rows_list.append(row_tuple) 
+0

非常感謝這一點。我到處尋找這種方法,但無法找到它的API,並在代碼文件中錯過了它。我開始認爲模塊沒有處理刪除的標誌。再次感謝。 – jiraiya