如何使用dbfpy获取字段类型?
我有一些dbf文件,想要在里面添加新的字段。为此,我使用了dbfpy来打开原始的dbf文件,复制所有的字段(或者我想保留的那些字段)和记录,然后创建一个新文件,里面包含这些字段和我想要的新字段。目前一切都运行得很好,除了一个小问题:我不知道怎么保持原始字段的类型,所以我只能把新文件里的所有字段都设置为“C”(字符型)。这样做目前能满足我的需求,但将来可能会有问题。
真正的问题是没有相关的文档。我在包的文件里搜索过,想找一些例子,但没有找到这个问题的答案(可能是因为我对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 个回答
1
我对dbfpy没有什么经验,除了几年前我第一次去找它的时候,它(还有其他几个)都不太符合我的需求。所以我自己写了一个。
下面是你可以用它来完成你任务的方法:
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"