2013-02-28 2 views
0

새 필드를 추가 할 dbf 파일이 있습니다. 이렇게하려면 dbfpy을 사용하여 원본 dbf를 열고 모든 필드 (또는 유지하고 싶은 필드) 및 레코드를 복사 한 다음 해당 필드와 원하는 새 파일을 더한 새 파일을 만듭니다. 사소한 세부 사항을 제외하고는 모두 잘 작동합니다. 원래 필드의 유형을 유지할 수는 없으므로 그 필드를 얻는 방법을 모르겠습니다. 내가 지금하고있는 일은 새로운 파일의 모든 필드를 "C"(문자)로 만드는 것인데, 지금까지는 필요한 것이지만 결국에는 문제가 될 수 있습니다.dbfpy를 사용하여 필드 유형을 얻는 방법은 무엇입니까?

실제 문제는 사용 가능한 문서가 없다는 것입니다. 패키지 파일을 통해 예제를 찾아 보았지만이 질문에 대한 답을 찾을 수 없었습니다. (나는 "녹색"이라는 단어로 찾을 수 없었을 것입니다. 저는 여전히 파이썬과 같습니다 ...) 나는 확실히 전문가가 아님).

코드의 예 : 시간에 미리

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" 
관련 문제