2013-02-28 64 views
0

我有一些我想添加新字段的dbf文件。爲此,我使用dbfpy來打開原始dbf,複製所有字段(或我想保留的字段)並記錄,然後創建一個新文件,其中包含這些字段以及我想要的新字段。除了一個小細節之外,所有工作都很好:我無法保留原始字段的類型,因爲我不知道如何獲取它們。我正在做的是將新文件中的所有字段都創建爲「C」(字符),目前爲止我所需要的都是可用的,但最終可能會成爲問題。如何使用dbfpy獲取字段類型?

真正的問題是沒有可用的文檔。我搜索了整個軟件包文件,在那裏尋找例子,但是找不到這個問題的答案(可能是我找不到「綠色」,我仍然在使用python ......我很肯定不是專家)。

代碼的一個例子:

from dbfpy import dbf 
import sys 

org_db_file = str(sys.argv[1]) 
org_db = dbf.Dbf(org_db_file, new = False) 

new_db_file = str(sys.argv[2]) 
new_db = dbf.Dbf(new_db_file, new = True) 

#Obtain original field names: 
fldnames = [] 
fldsize = {} 
for names in org_db.fieldNames: 
    fldnames.append(names) 
    fldsize[name] = 0 

#Cycle thru table entries: 
for rec in org_db: 

    #Cycle thru columns to obtain fields' name and value: 
    for name in fldnames: 
    value = str(rec[name]) 
    if len(value) > fldsize[name]: 
     fldsize[name] = len(value) 

#Copy original fields to new table: 
for names in fldnames: 
    new_db.addField((names, "C", fldsize[name])) 

#Add new fields: 
new_fieldname = "some_name" 
new_db.addField((new_fieldname, "C", 2)) 

#Copy original entries and store new values: 
for rec in org_db: 

    #Create new record instance for new table: 
    new_rec = new_db.newRecord() 

    #Populate fields: 
    for field in fldnames: 
    new_rec[field] = rec[field] 

    #Store value of new field for record i: 
    new_rec[new_fieldname] = "some_value" 
    new_rec.store()  

new_db.close() 

預先感謝您的時間。 乾杯。

回答

1

我沒有任何dbfpy的經驗,除了幾年前我第一次看到它(和其他幾個)沒有滿足我的需求時。 So I wrote my own.

這裏是你將如何使用它完成任務:

import dbf 
import sys 

org_db_file = sys.argv[1] 
org_db = dbf.Table(org_db_file) 

new_db_file = sys.argv[2] 
# postpone until we have the field names... 
# new_db = dbf.Dbf(new_db_file, new = True) 

# Obtain original field list: 
fields = org_db.field_names 
for field in fields[:]: # cycle through a separate list 
    if field == "something we don't like": 
     fields.remove(field) 

# now get definitions for fields we keep 
field_defs = ord_db.structure(fields) 

# Add new fields: 
field_defs.append("some_name C(2)") 

# now create new table 
new_db = ord_db.new(new_db_file, field_specs=field_defs) 

# open both tables 
with dbf.Tables(ord_db, new_db): 

    # Copy original entries and store new values: 
    for rec in org_db: 

     # Create new record instance for new table: 
     new_db.append() 

     # Populate fields: 
     with new_db.last_record as new_rec: 
      for field in new_db.field_names: 
       new_rec[field] = rec[field] 

       # Store value of new field for record i: 
       new_rec[new_fieldname] = "some_value"