2013-08-26 48 views
4

我有~300個帶有.dbf文件的文件夾,我想將其轉換爲.csv文件。在Python中將.dbf批量轉換爲.csv

我使用os.walk來查找所有.dbf文件,然後使用dbfpy模塊將每個.dbf文件轉換爲.csv。它似乎正確地找到並讀取.dbf文件,但不會將它們轉換爲.csv。我相信csv.writer代碼是問題。我沒有收到任何錯誤,但文件保持爲.dbf。

我在下面的代碼是基於找到的代碼here

import csv 
from dbfpy import dbf 
import os 

path = r"\Documents\House\DBF" 


for dirpath, dirnames, filenames in os.walk(path): 
    for filename in filenames: 
     if filename.endswith('.DBF'): 
      in_db = dbf.Dbf(os.path.join(dirpath, filename)) 
      csv_fn = filename[:-4]+ ".csv" 
      out_csv = csv.writer(open(csv_fn,'wb')) 

     names = [] 
     for field in in_db.header.fields: 
      names.append(field.name) 
     out_csv.writerow(names) 


     for rec in in_db: 
      out_csv.writerow(rec.fieldData) 

     in_db.close() 

回答

4

原始文件將保留爲dbf。你實際上並沒有取代它,而是創建一個新的csv文件。我認爲問題是寫入磁盤永遠不會發生。我懷疑csv編寫器沒有刷新文件緩衝區。

我看到的另一個問題是out_csv是有條件地創建的,所以如果你在該目錄中有不同的擴展名的其他文件,你會遇到問題。

嘗試使用情況管理器:

for dirpath, dirnames, filenames in os.walk(path): 
    for filename in filenames: 
     if filename.endswith('.DBF'): 
      csv_fn = filename[:-4]+ ".csv" 
      with open(csv_fn,'wb') as csvfile: 
       in_db = dbf.Dbf(os.path.join(dirpath, filename)) 
       out_csv = csv.writer(csvfile) 
       names = [] 
       for field in in_db.header.fields: 
        names.append(field.name) 
       out_csv.writerow(names) 
       for rec in in_db: 
        out_csv.writerow(rec.fieldData) 
       in_db.close() 

的「與」陳述(上下文管理器)將關閉該文件,並在年底刷新緩衝區,沒有你需要做的是明確的。

+0

感謝您的回覆......不幸的是,我仍然無法得到這個工作。我在in_db之前得到了第二個「as」的「無效語法」錯誤。我嘗試了一堆不同的東西,但沒有運氣......呃。任何建議將非常歡迎! – 5tanczak

+0

對不起,這是我的一部分。我沒有運行這個,並犯了幾個錯別字。道德 - 總是測試你的代碼,特別是當你確定它的工作原理時:)試試上面編輯的代碼,讓我知道你是否仍然有問題。 – munk

+1

接近我想。在運行新版本後,我得到了以下錯誤:「struct.error:unpack需要長度爲8的字符串參數」我將「new = True」添加到「dbf.Dbf(os.path.join(dirpath,filename),新=真)「,以緩解這一點。現在我得到一個屬性錯誤:「AttributeError:\ __ exit__」我已經做了一些搜索,看起來這是「with statement」的常見問題,但不清楚如何解決。 – 5tanczak