python下用dbfread操作DBF文件

dbf文件可用excel打开,同时exel也可以将文件另存为dbf格式。

dbfread项目地址:https://github.com/zycool/dbfread

dbfread库官方文档:https://dbfread.readthedocs.io/en/latest/dbf_objects.html

安装:pip install dbfread

dbfread库是用来操作DBF文件(数据库文件),只有读取和删除的操作,没有写入操作。

DBF文件对象,不常用的没有做整理。


from  dbfread import DBF

table1=DBF('E:\pythoninterviewquestions\meng_one.DBF',encoding='gbk',char_decode_errors='ignore',load=True)

1.load=False
默认情况下,记录将直接从磁盘流式传输。如果通过 load=True,则将它们加载到列表中,并用作records和deleted属性。
您可以随时使用load()和 unload()方法加载和卸载记录。

2.encoding=None
指定要使用的字符编码。
缺省情况下,dbfread将尝试从language_driver字节中猜测字符编码 。如果失败,则返回ASCII。

3.char_decode_errors=‘strict’
用于处理解码错误的错误处理方案。这作为errors选项传递给该 bytes.decode()方法。从该方法的文档中:
“默认值为’strict’,这意味着解码错误会引发UnicodeDecodeError。其他可能的值是’ignore’和’replace’,以及在codecs.register_error中注册的任何其他可处理UnicodeDecodeErrors的名称。”

方法
1.load
将记录加载到内存中。这将同时加载记录和已删除的记录。在records和deleted属性现在将记录名单。
2.unload
从内存中卸载记录。在records和deleted 属性现在会的实例RecordIterator,从磁盘流记录。

属性
1.records
如果表已加载,则这是记录列表。如果不是,那是一个 RecordIterator对象。无论哪种情况,对其进行迭代或调用len()都将得到相同的结果。
2.deleted
如果加载了表,则这是已删除记录的列表。如果不是,那是一个RecordIterator对象。无论哪种情况,对其进行迭代或调用len()都将得到相同的结果。

3.loaded
TRUE 如果记录已加载到内存中

4.name
表名。这是文件名的小写字母

5.date
文件上次更新的日期(如datetime.date),或者 None日期全为零或无效。

6.field_names
字段名称的列表,按它们在文件中出现的顺序排列。例如,这可以用于在CSV文件中生成标题行。

7.encoding
文件中使用的字符编码。这由language_driver标头中的字节确定 ,可以用encoding关键字参数覆盖 。

8.filename
DBF文件的文件名。

接下来进行一些简单的实例操作
1.打开一个DBF文件,有两个方法

#方法1:
table1=DBF('E:\pythoninterviewquestions\meng_one.DBF',encoding='gbk',char_decode_errors='ignore',load=True)
#方法2:
with DBF('E:\pythoninterviewquestions\meng_one.DBF') as e:

2.读取DBF文件记录
如果打开DBF文件方法,默认是load=False,那么记录将直接从磁盘流式传输。不可以通过table1[index]读取数据。通过遍历的方法读取

table1=DBF('E:\pythoninterviewquestions\meng_one.DBF',encoding='gbk',char_decode_errors='ignore')
for rows in table1:
    print(table1)

输出结果可以看到返回的一行数据是一个有序字典。
加load=True,则将它们加载到列表中,可以records属性访问数据

table1=DBF('E:\pythoninterviewquestions\meng_one.DBF',encoding='gbk',char_decode_errors='ignore',load=True)
print(table1.records)

输出结果可以看出,列表的元素都是一个有序字典。
文件打开后我们可以获取第一行的字段名,可以只获取行数据

table1=DBF('E:\pythoninterviewquestions\meng_one.DBF',encoding='gbk',char_decode_errors='ignore',load=True)

#获取第一行的字段值,数据
res1=table1.records[0]  #返回的是有序字典,可以使用字典的keys,values属性
res2=res1.keys()
res3=res1.values()
print(res2)
print(res3)
 

实例:

用python3实现如下功能:

有两个dbf文件1.dbf,2.dbf,将2.dbf文件中的数据插入到1.dbf中,重复数据无需插入。上网查了很多资料,看了很多外置库排了一些坑。
外部库 适用python版本 实现功能
pdfpy python2.x 可以对DBF文件进行写入
dbfread python2.x/3.x 可以对DBF文件的读取,删除
xlwt python2.x/3.x 可以对DBF文件进行写入
openpyxl python2.x/3.x 不可以对DBF文件进行读取
xlrd python2.x/3.x 不可以对DBF文件进行读取
xlsxwriter python2.x/3.x 还没试

总结:想要通过python3实现对DBF文件的读写,可以通过dbfread和xlwt这两个外置库。
 

from dbfread import DBF
import xlwt

table1=DBF('E:\pythoninterviewquestions\SCD_98_601_20200327_DJ.DBF',encoding='gbk',char_decode_errors='ignore')
table2=DBF('E:\pythoninterviewquestions\SCD_98_601_20200327_DJ_add.DBF')

list1=[table1,table2]
data=[]
row1=()

for i in list1:
    for rows in i:
        row1 =tuple(rows.keys())
        temp=tuple(rows.values())
        if temp not in data:
            data.append(temp)

data.insert(0,row1)
# print(data)
# print(len(data))

#向meng_three.DBF写入
wb = xlwt.Workbook() #创建工作薄
f = wb.add_sheet('class1') #创建工作表

for i in range(len(data)):
    for j in range(len(row1)):
        f.write(i,j,data[i][j])

wb.save('E:\pythoninterviewquestions\meng_three.DBF')

 

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangan094

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值