python如何写入dbf文件内容及创建dbf文件
作者:lover-517
这篇文章主要介绍了python如何写入dbf文件内容及创建dbf文件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
想要实现打开dbf文件后写入数据,奈何python3网上没有任何方法,有一个人自己写了个类,基于个人要求,需要操作dbf文件实现内容添加,以下方法需要python2的环境来是实现。
需求:向八个dbf文件中插入数据
一、需要导入的模块
import string
import time
import random
import sys
import os
import csv
import getopt
from dbfpy import dbf
import itertools
import warnings
warnings.filterwarnings('ignore')二、实现dbf文件操作
class Do_to_Dbf(object):
def __init__(self,Cilent_id,Fund_acc,SecuAcc):
self.Cilent_id=Cilent_id
self.Fund_acc = Fund_acc
self.SecuAcc=SecuAcc
# 创建新的dbf文件
def writeDbfFile(self,filename,header,content):
db=dbf.Dbf(filename,new=True)
for field in header:
if type(field) == unicode:
field = field.encode('GBK')
db.addField((field, 'C', 60))
for record in content:
rec = db.newRecord()
for key, value in itertools.izip(header, record):
if type(value) == unicode:
rec[key] = value.encode('GBK')
else:
rec[key] = value
rec.store()
db.close()
# 再原有的dbf文件中追加内容
def add_DbfFile_content(self,filename,content):
db=dbf.Dbf(filename)
for record in content:
rec = db.newRecord()
for key, value in itertools.izip(db.header, record):
if type(value) == unicode:
rec[key] = value.encode('GBK')
else:
rec[key] = value
rec.store()
db.close()
def get_code(self):
code = [[], []]
code[0] = ['000002', '000060', '159901', '159930', '300030']
code[1] = ['510010', '510300', '600036', '688001', '700360']
return code
## 下边的函数create开头的都是创建新的dbf文件,根据需要的表头来 ##
## 下边的函数add开头的都是再原有dbf文件下添加内容 ##
def create_custinfo(self):
header=['CilentID','CilentName','BranchID','EncMode','TradePwd','Status']
pwd = '34614C364D51746D79335231584559444D68337470673D3D'
content=[]
for i in range(len(self.Cilent_id)):
part=[
self.Cilent_id[i],
self.Cilent_id[i],
self.Cilent_id[i][:4],
1,
pwd,
0]
content.append(part)
filename='doc/'+'custinfo_v01_12360000_3_%s.dbf'%(time.strftime('%Y%m%d_%H',time.localtime()))
self.writeDbfFile(filename,header,content)
def create_fundasset(self):
header=['FundAcc','CurType','FundAvlBal','FundFrzBal','FundBal','FBuySale','FUncBuy','FUncSale','FFundTrsf']
content=[]
for i in range(len(self.Fund_acc)):
part=[
self.Fund_acc[i],
0,
'F2195BC3951AAD0465B72CE593B79141',
'A160C3DB0CE4098FDCD07FC86865BF33',
'F2195BC3951AAD0465B72CE593B79141',
'A160C3DB0CE4098FDCD07FC86865BF33',
'A160C3DB0CE4098FDCD07FC86865BF33',
'A160C3DB0CE4098FDCD07FC86865BF33',
'BAFBDC944A98ADCD131416B325BE8D3C'
]
content.append(part)
filename='doc/'+'fundasset_v01_12360000_3_%s.dbf'%(time.strftime('%Y%m%d_%H',time.localtime()))
self.writeDbfFile(filename,header,content)
def create_fundinfo(self):
header=['FundAcc','FAccType','ClientID','TradeWays','FAccStatus','FundLimits','TrdRights','FundRights','CreditFlag','CreStatus','InvestType']
content=[]
for i in range(len(self.Fund_acc)):
part=[
self.Fund_acc[i],
1,
self.Cilent_id[i],
'jk012345678',
0,
'?',
'01234567',
'@',
0,
0,
0
]
content.append(part)
filename='doc/'+'fundinfo_v01_12360000_3_%s.dbf'%(time.strftime('%Y%m%d_%H',time.localtime()))
self.writeDbfFile(filename,header,content)
def create_fundtrdctrl(self):
header=['FundAcc','Market','BSFlag','StkType','StkCode','Direct']
content=[]
# for i in range(len(self.Fund_acc)):
# part=[
# self.Fund_acc[i],
# 1,
# 2,
# 0,
# '002612',
# 1
# ]
# content.append(part)
# print(content)
filename='doc/'+'fundtrdctrl_v01_12360000_3_%s.dbf'%(time.strftime('%Y%m%d_%H',time.localtime()))
self.writeDbfFile(filename,header,content)
def create_secuinfo(self):
header=['ClientID','SecuAcc','SAccType','Market','RegFlag','Seat','Status','SAccLimits','SecuRights']
content=[]
for i in range(len(self.Cilent_id)):
for j in range(2):
seat=['016701','']
part=[
self.Cilent_id[i],
self.SecuAcc[j][i],
1,
j,
j,
seat[j],
0,
'',
'@'
]
content.append(part)
filename='doc/'+'secuinfo_v01_12360000_3_%s.dbf'%(time.strftime('%Y%m%d_%H',time.localtime()))
self.writeDbfFile(filename,header,content)
def create_SJSKS(self):
header=['KSXWDM','KSGDDM','KSYWLB','KSKSGE','KSFSRQ','KSBYZD']
content=[]
# for i in range(len(Fund_acc)):
# part=[
# '',
# '',
# '',
# '',
# '',
# ]
# content.append(part)
filename='doc/'+'SJSKS_v01_12360000_3_%s.dbf'%(time.strftime('%Y%m%d_%H',time.localtime()))
self.writeDbfFile(filename,header,content)
def create_stkasset(self):
header=['FundAcc','Market','SecuAcc','StockCode','StkAvlQty','StkFrzQty','StkBal',
'SBuySale','SBuyUnFrz','SSaleFrz','LstBuyCst','LstprfCst','BuyCst',
'ProfitCst','StkRemain','StkCorpRem','CreStkBal']
content=[]
for i in range(len(self.Fund_acc)):
for j in range(2):
codes=self.get_code()
for code in codes[j]:
part=[
self.Fund_acc[i],
j,
self.SecuAcc[j][i],
code,
'F461FA1CB2A69A4EBB12F130455748DB',
'BAFBDC944A98ADCD131416B325BE8D3C',
'F461FA1CB2A69A4EBB12F130455748DB',
'BAFBDC944A98ADCD131416B325BE8D3C',
'BAFBDC944A98ADCD131416B325BE8D3C',
'BAFBDC944A98ADCD131416B325BE8D3C',
'77E3F6BDC6D282F4FA3841AD363517CD',
'77E3F6BDC6D282F4FA3841AD363517CD',
'77E3F6BDC6D282F4FA3841AD363517CD',
'77E3F6BDC6D282F4FA3841AD363517CD',
'BAFBDC944A98ADCD131416B325BE8D3C',
'BAFBDC944A98ADCD131416B325BE8D3C',
'BAFBDC944A98ADCD131416B325BE8D3C',
]
content.append(part)
filename='doc/'+'stkasset_v01_12360000_3_%s.dbf'%(time.strftime('%Y%m%d_%H',time.localtime()))
self.writeDbfFile(filename,header,content)
def create_zqyXXXXX(self):
header=['gddm','zqye','qysl','kcqy','gsdm','zhxh','djrq','clbz']
content=[]
# for i in range(len(Fund_acc)):
# part=[
# '',
# '',
# '',
# '',
# '',
# '',
# '',
# '',
# ]
# content.append(part)
filename='doc/'+'zqyXXXXX_v01_12360000_3_%s.dbf'%(time.strftime('%Y%m%d_%H',time.localtime()))
self.writeDbfFile(filename,header,content)
def add_custinfo(self):
content=[]
pwd = '34614C364D51746D79335231584559444D68337470673D3D'
for i in range(len(self.Cilent_id)):
part=[
self.Cilent_id[i],
self.Cilent_id[i],
self.Cilent_id[i][:4],
1,
pwd,
0]
content.append(part)
filename='doc/custinfo_v01_12360000_3_20191014_01.dbf'
self.add_DbfFile_content(filename,content)
def add_fundasset(self):
content=[]
for i in range(len(self.Fund_acc)):
part=[
self.Fund_acc[i],
0,
'F2195BC3951AAD0465B72CE593B79141',
'A160C3DB0CE4098FDCD07FC86865BF33',
'F2195BC3951AAD0465B72CE593B79141',
'A160C3DB0CE4098FDCD07FC86865BF33',
'A160C3DB0CE4098FDCD07FC86865BF33',
'A160C3DB0CE4098FDCD07FC86865BF33',
'BAFBDC944A98ADCD131416B325BE8D3C'
]
content.append(part)
filename='doc/fundasset_v01_12360000_3_20191014_01.dbf'
self.add_DbfFile_content(filename,content)
def add_fundinfo(self):
content=[]
for i in range(len(self.Fund_acc)):
part=[
self.Fund_acc[i],
1,
self.Cilent_id[i],
'jk012345678',
0,
'?',
'01234567',
'@',
0,
0,
0
]
content.append(part)
filename='doc/fundinfo_v01_12360000_3_20191014_01.dbf'
self.add_DbfFile_content(filename,content)
def add_fundtrdctrl(self):
content=[]
filename='doc/fundtrdctrl_v01_12360000_3_20191014_01.dbf'
self.add_DbfFile_content(filename,content)
def add_secuinfo(self):
content=[]
for i in range(len(self.Cilent_id)):
for j in range(2):
seat=['016701','']
part=[
self.Cilent_id[i],
self.SecuAcc[j][i],
1,
j,
j,
seat[j],
0,
'',
'@'
]
content.append(part)
filename='doc/secuinfo_v01_12360000_3_20191014_01.dbf'
self.add_DbfFile_content(filename,content)
def add_SJSKS(self):
content=[]
filename='doc/SJSKS_v01_12360000_3_20191014_01.dbf'
self.add_DbfFile_content(filename,content)
def add_stkasset(self):
content=[]
for i in range(len(self.Fund_acc)):
for j in range(2):
codes=self.get_code()
for code in codes[j]:
part=[
self.Fund_acc[i],
j,
self.SecuAcc[j][i],
code,
'F461FA1CB2A69A4EBB12F130455748DB',
'BAFBDC944A98ADCD131416B325BE8D3C',
'F461FA1CB2A69A4EBB12F130455748DB',
'BAFBDC944A98ADCD131416B325BE8D3C',
'BAFBDC944A98ADCD131416B325BE8D3C',
'BAFBDC944A98ADCD131416B325BE8D3C',
'77E3F6BDC6D282F4FA3841AD363517CD',
'77E3F6BDC6D282F4FA3841AD363517CD',
'77E3F6BDC6D282F4FA3841AD363517CD',
'77E3F6BDC6D282F4FA3841AD363517CD',
'BAFBDC944A98ADCD131416B325BE8D3C',
'BAFBDC944A98ADCD131416B325BE8D3C',
'BAFBDC944A98ADCD131416B325BE8D3C',
]
content.append(part)
filename='doc/stkasset_v01_12360000_3_20191014_01.dbf'
self.add_DbfFile_content(filename,content)
def add_zqyXXXXX(self):
content=[]
filename='doc/zqyXXXXX_v01_12360000_3_20191014_01.dbf'
self.add_DbfFile_content(filename,content)三、生成需要的数据和提供脚本参数
# 因为项目要实现自动化脚本,传入两个参数,从那个账号开始,以及多少个数据 #
def message(argv):
start_account = ""
num = ""
try:
opts, args = getopt.getopt(argv, "hs:n:", ["help", "start_account=", "num="])
except getopt.GetoptError:
print('Error:create_dbf_file.py -s <start_account> -n <num>')
print(' or: create_dbf_file.py --start_account=<start_account> --num=<num>')
sys.exit(2)
for opt, arg in opts:
if opt in ("-h", "--help"):
print(' create_dbf_file.py -s <start_account> -n <num>')
print(' create_dbf_file.py --start_account=<start_account> --num=<num>')
sys.exit()
elif opt in ("-s", "--start_account"):
start_account = arg
elif opt in ("-n", "--num"):
num = arg
def get_account(start_account,num):
accounts = []
for i in range(num):
account=start_account +i
accounts.append(str(account))
return accounts
def get_secuacc(tools,num):
secuacc=[[],[]]
for i in ['0','A']:
if i=='0':
passwds = secuacc[0]
else:
passwds = secuacc[1]
while len(passwds)< int(num):
part=random.sample(tools,9)
passwd="".join(part)
if passwd in passwds:
continue
else:
passwds.append(i+passwd)
return secuacc
# 保存数据
def create_to_csv(file_path,filename,data):
f=open(file_path+'/'+filename,'wb')
writer=csv.writer(f)
a=[]
for i in data:
a.append(i.decode("utf-8").encode("gbk"))
writer.writerows(a)
f.close()
def read_to_csv(filename):
reader=csv.reader(open(filename))
a=[]
for i in reader:
s=''.join(i)
a.append(s)
return a四、调用
if __name__ == '__main__':
# 代码需要命令行执行,需要传入参数,有提示在message函数里 #
tools=string.digits
message(argv=sys.argv[1:])
Cilent_id=get_account(int(sys.argv[1]),int(sys.argv[2]))
Fund_acc=get_account(int(time.strftime('%m%d%H%S0000',time.localtime())),int(sys.argv[2]))
SecuAcc=get_secuacc(tools,int(sys.argv[2]))
file_path=os.getcwd()+'/data'
if os.path.isdir(file_path):
pass
else:
os.mkdir(file_path)
create_to_csv(file_path,'Cilent_id',Cilent_id)
create_to_csv(file_path,'Fund_acc',Fund_acc)
create_to_csv(file_path,'SecuAcc_SH',SecuAcc[0])
create_to_csv(file_path, 'SecuAcc_SZ', SecuAcc[1])
add_dbffile=Do_to_Dbf(Cilent_id,Fund_acc,SecuAcc)
# add_dbffile.create_custinfo()
# add_dbffile.create_fundasset()
# add_dbffile.create_fundinfo()
# add_dbffile.create_fundtrdctrl()
# add_dbffile.create_SJSKS()
# add_dbffile.create_zqyXXXXX()
# add_dbffile.create_stkasset()
# add_dbffile.create_secuinfo()
add_dbffile.add_custinfo()
add_dbffile.add_fundasset()
add_dbffile.add_fundinfo()
add_dbffile.add_fundtrdctrl()
add_dbffile.add_secuinfo()
add_dbffile.add_SJSKS()
add_dbffile.add_stkasset()
add_dbffile.add_zqyXXXXX()总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
