如何删除包含 alpha 值或整个 dbf 列的 dbf 行

Posted

技术标签:

【中文标题】如何删除包含 alpha 值或整个 dbf 列的 dbf 行【英文标题】:How to delete dbf rows containing an alpha value or an entire dbf column 【发布时间】:2020-01-12 06:58:57 【问题描述】:

我想删除我的 dfb 上包含特定数据的一些行和列。

假设 dfb 的结构如下图所示,并且我想删除以 'knapford' 作为 'Prov' 的行和 'Reg' 列。

当我尝试遵循这个脚本时:

table = dbf.Table(wonderland.dbf).open(mode=dbf.READ_WRITE)
with table as tab:
    print (table)
    for record in dbf.Process(tab):
        dbf.delete(record[0])

我收到此错误:

  File "<ipython-input-4-d8feabfc9819>", line 4, in <module>
    dbf.delete(record[0])

  File "C:\Users\fassi\AppData\Local\Continuum\anaconda3\lib\site-packages\dbf\__init__.py", line 8349, in delete
    if not template and record._meta.status == CLOSED:

AttributeError: 'int' object has no attribute '_meta'

我想到了这个其他建议,但我想知道它是否真的会删除该行的所有字段,只是一些特定的字段或所有记录!

table = dbf.Table(wonderland.dbf).open(mode=dbf.READ_WRITE)
with table as tab:
    dbf.delete_fields(table, Reg)
    for record in dbf.Process(tab):
        if record[0].strip()=='Knapford': #since we've delete the Reg, Prov is becoming record[0]?
            dbf.delete(record)

提前致谢

【问题讨论】:

【参考方案1】:

我认为这应该可行:

from simpledbf import Dbf5

dbf = Dbf5('file.dbf')
data = dbf.to_dataframe()

for row in range(len(data)):
    Reg= data.loc[row,'Reg']
    Prov = data.loc[row,'Prov']
    if Reg =='knapford' or Prov =='knapford':
        data.drop(index=row, axis=0, inplace=True)

其他脚本运行良好:

import dbf
with table as tab:
    for record in dbf.Process(tab):
        if record[1].strip()=='Knapford':
            #print (record)
            dbf.delete(record)
table.pack()

【讨论】:

亲爱的@Misieq,我为同一个dbf重试了这段代码,它只对数据帧中的行有效(没有删除dbf的行)。我不知道我错过了什么,因为它第一次工作^^" 因为在这一行:data = dbf.to_dataframe() 我们正在将 'dbf' 复制到 'data' 变量中,从现在开始我们正在处理 'data' 我明白这一点,但为什么它第一次工作?是不是很奇怪?!

以上是关于如何删除包含 alpha 值或整个 dbf 列的 dbf 行的主要内容,如果未能解决你的问题,请参考以下文章

如何从包含日期时间列的表中获取某些行和“先前”行?

java 里面怎么通过sql命令来对dbf文件通过调剂进行删除?

当 SQL 出现最小值或最大值时,如何获取时间戳?

如何在整个 Pandas 数据框中搜索字符串并获取包含它的列的名称?

如果整个范围为空白,则删除整行?

带有星形列的 DataGrid 调整整个 DataGrid 的大小