pandas 使用ydbf将DBF文件转换为CSV格式

6vl6ewon  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(417)

我尝试将一个特定的DBF文件转换为CSV格式,但是我的脚本无法转换特定的值。我使用的是Python中的ydbf包。
我总共有598个DBF文件要转换,其中我标准地使用以下代码:

with ydbf.open(filename, encoding=encoding) as dbf:
   for record in dbf:
      records[index] = record
      index += 1
   df = pd.DataFrame.from_dict(records, orient='index')
df.to_csv(filename[:-4] + ".csv", index=False)

对于6个文件有一些错误仍然存在,这6个文件中的5个使用下面的代码解决,但最后一个文件不断返回值错误。我尝试了几种编码方法:拉丁文、cp1250、cp1251、cp1252和ascii,但它们都返回相同的错误:
发生错误(值错误:以10为基数int()的文本无效:B 'RE'),同时阅读记录#0。
我也试过:

dbf = DBF(file)
dataResult = pd.DataFrame(iter(dbf))

但这会返回相同的错误。
我的dbf文件的一个例子:
一个二个一个一个

zsohkypk

zsohkypk1#

主要问题是dbf表中有一个数字字段,其中包含字符"RE"
第二个问题是由于ydbf在将记录提供给您之前转换了记录中的值--因此整个try/except链都是无用的。
一种可能的解决方案是以二进制模式编辑文件,并将RE更改为0
另一个可能的解决方案是使用我的dbf library和一个自定义数值函数来处理无效数据:

import dbf

NaN = float('nan')

def fix_integer(bytes, fielddef, *ignore):
    try:
        return int(bytes)
    except ValueError:
        return NaN

table = dbf.Table(
        'path/to/table.dbf',
        field_data_types={'bad_field_name_here': fix_integer},
        )

dbf.export(table)  # which defaults to dbf.export(table, header=True, dialect='dbf')

相关问题