简体   繁体   中英

How to modify dbf files in Python

Suppose I have different number of dbf files in some folders under the root directory, d:\\myfolder . The content of a dbf file looks like the following:

Field1 
11110481123
12150480021
...

I want to add a field (say, Field1 ) that contains only the last 4 digits of the values in Field2 .

Field1          Field2
11110481123     1123
12150480021     0021
...             ...

Then, I want to delete Field1 .

How can I do the job for all the dbf files that are scattered across different folders in Python?

You would need the module called dbf available via pypi ( pip install dbf ). Here's a snippet of how you can add and delete fields from a table:

import dbf

table = dbf.Table('t1', 'field1 N(12, 0)')
for record in ((11110481123,), (12150480021,)):
    table.append(record)
table.close()

# extend the existing table
dbf.add_fields('t1', 'field2 N(4, 0)')

table = dbf.Table('t1')
records = table.sql('select *')
for record in records:
    record.field2 = int(str(record.field1)[-4:])
table.close()

dbf.delete_fields('t1', 'field1')

Though it would be less computational intensive to just go over the first field and alter it to store the last 4 digits of its value.

Using the above-mentioned dbf library (plus my other library, antipathy ), these are ( roughly ) the steps you would take:

# untested

import dbf
from antipathy import Path

for path, dirs, files in Path.walk('.'):
    files = [f for f in files if f.ext == '.dbf']
    for db in files:
        if I_want_to_change_this_table(db):
            with dbf.Table(db) as db:
                db.add_fields('Field2 C(4)')
                for record in db:
                    dbf.write(Field2=record.Field1[-4:])
                db.delete_fields('Field1')
                db.pack()

The I_want_to_change_this_table() is a function you provide if you don't want to change every table, just some of them. If you want to change them all you can remove that line.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM