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