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')

原文链接:https://blog.csdn.net/DH2442897094/article/details/107619276

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐