【问题标题】:Python Write value in dbf filePython在dbf文件中写入值
【发布时间】:2025-11-25 21:40:01
【问题描述】:

我正在使用这个 DBF 库 http://pythonhosted.org/dbf/

我在 DBF 表中添加了一列,现在我需要在该列中添加值,但是我遇到了问题。

import dbf
import random

db = dbf.Table('test.dbf')
with db:
    #db.add_fields('ClasseType C(10)')
    for record in db:
        dbf.write(record, data="test")

错误:

“回溯(最近一次通话最后一次): 文件“C:/Python/23/dbf/addField.py”,第 9 行,在 dbf.write(记录,数据=“测试”) 文件“C:\Anaconda2\lib\site-packages\dbf\ver_2.py”,第 7990 行,写入 收集(记录,kwargs) 文件“C:\Anaconda2\lib\site-packages\dbf\ver_2.py”,第 8245 行,聚集 引发 FieldMissingError(key) dbf.ver_2.FieldMissingError:'数据:表中没有这样的字段' 进程以退出代码 1 结束

【问题讨论】:

  • 为什么你认为错误信息在说谎?
  • 如果答案符合您的要求,请标记为“已接受”。

标签: python dbf


【解决方案1】:

dbf 模块似乎已更改。这是“我的新的和改进的”答案。原始答案如下所示。

新答案(2018 11 28)

  • 我创建了一个只有三个字段的表,然后以读写模式打开它,以便向其中添加三个记录。我打印记录以证明成功。
  • 我关闭表并以读写模式重新打开它,为电话号码添加一个字段,然后继续使用电话号码修改每条记录。我再次打印记录以证明成功。
  • 我之前发现with record as r 结构可以访问记录的各个字段。这次提醒我,字符串字段存储在右侧空白填充。这就是我在r.name.strip() 中使用strip() 的原因,这样我就可以在字典中查找了。

--

## code to work with dbf module  aenum-2.1.2 dbf-0.97.11

import dbf

table = dbf.Table('temptable', 'name C(30); age N(3,0); birth D')

print('db definition created with field names:', table.field_names)

table.open(mode=dbf.READ_WRITE)
for datum in (('John Doe', 31, dbf.Date(1979, 9,13)),('Ethan Furman', 102, dbf.Date(1909, 4, 1)),('Jane Smith', 57, dbf.Date(1954, 7, 2)),('John Adams', 44, dbf.Date(1967, 1, 9)),):
    table.append(datum)

print ('records added:')
for record in table:
    print (record)
    print ('-----')

table.close()

table.open(mode=dbf.READ_WRITE)

table.add_fields('telephone C(10)')

telephones = {'John Doe': '1234', 'Ethan Furman': '2345', 'Jane Smith': '3456', 'John Adams': '4567'}
for record in table:
    with record as r:
        r.telephone = telephones[r.name.strip()]

print ('updated records')
for record in table:
    print (record)
    print ('-----')

原答案

您可以向 dbf 表添加一列,然后按照此脚本中演示的方式将值写入该表中的各个单元格。请注意,我已将相同的电话号码添加到所有单元格。

我首先创建此产品文档中提供的表格和内容。我确认field_names 和表格的内容符合预期。

>>> import dbf
>>> table = dbf.Table('temptable', 'name C(30); age N(3,0); birth D')
>>> table.field_names
['name', 'age', 'birth']
>>> table.open()
dbf.ver_33.Table('temptable.dbf', status=<DbfStatus.READ_WRITE: 2>)
>>> for datum in (('John Doe', 31, dbf.Date(1979, 9,13)),('Ethan Furman', 102, dbf.Date(1909, 4, 1)),('Jane Smith', 57, dbf.Date(1954, 7, 2)),('John Adams', 44, dbf.Date(1967, 1, 9)),):
...     table.append(datum)
... 
>>> for record in table:
...     record
...     
 John Doe                       3119790913
 Ethan Furman                  10219090401
 Jane Smith                     5719540702
 John Adams                     4419670109
>>> table.close()

然后我重新打开表格,添加电话号码列并验证新更新的field_names 属性。正如预期的那样,新字段为空白。

>>> table = dbf.Table('temptable.dbf')
>>> table.open()
dbf.ver_33.Table('temptable.dbf', status=<DbfStatus.READ_WRITE: 2>)
>>> table.add_fields('Telephone C(10)')
>>> table.field_names
['name', 'age', 'birth', 'telephone']
>>> for record in table:
...     record.name, record.birth, record.telephone
...     
('John Doe                      ', datetime.date(1979, 9, 13), '          ')
('Ethan Furman                  ', datetime.date(1909, 4, 1), '          ')
('Jane Smith                    ', datetime.date(1954, 7, 2), '          ')
('John Adams                    ', datetime.date(1967, 1, 9), '          ')

我多次尝试设置 telephone 的单个值,但均未成功。其中一条诊断信息让我倾向于使用涉及with 的句法结构,而这一个有效。 (顺便说一句,我为北美电话号码选择的字段长度太小了。)

>>> for record in table:
...     with record as r:
...         r.telephone = 'xxx xxx xx'
...         
>>> for record in table:
...     record
...     
 John Doe                       3119790913xxx xxx xx
 Ethan Furman                  10219090401xxx xxx xx
 Jane Smith                     5719540702xxx xxx xx
 John Adams                     4419670109xxx xxx xx
>>> table.close()

【讨论】:

  • 不错的答案! +1 :)
  • @EthanFurman 我没有建立联系,直到我刚才瞥了一眼,看到了你的名字。
  • 我相信这个答案不再适用于最新的 dbf 包,你应该使用 table.open(mode=dbf.READ_WRITE) 使表可写,否则你'会出错
  • @VincentWen:谢谢!请查看新答案。我相信现在是正确的。