python如何寫入dbf文件內(nèi)容及創(chuàng)建dbf文件
想要實(shí)現(xiàn)打開dbf文件后寫入數(shù)據(jù),奈何python3網(wǎng)上沒有任何方法,有一個(gè)人自己寫了個(gè)類,基于個(gè)人要求,需要操作dbf文件實(shí)現(xiàn)內(nèi)容添加,以下方法需要python2的環(huán)境來是實(shí)現(xiàn)。
需求:向八個(gè)dbf文件中插入數(shù)據(jù)
一、需要導(dǎo)入的模塊
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')二、實(shí)現(xiàn)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
# 創(chuàng)建新的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文件中追加內(nèi)容
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
## 下邊的函數(shù)create開頭的都是創(chuàng)建新的dbf文件,根據(jù)需要的表頭來 ##
## 下邊的函數(shù)add開頭的都是再原有dbf文件下添加內(nèi)容 ##
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)三、生成需要的數(shù)據(jù)和提供腳本參數(shù)
# 因?yàn)轫?xiàng)目要實(shí)現(xiàn)自動(dòng)化腳本,傳入兩個(gè)參數(shù),從那個(gè)賬號(hào)開始,以及多少個(gè)數(shù)據(jù) #
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
# 保存數(shù)據(jù)
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四、調(diào)用
if __name__ == '__main__':
# 代碼需要命令行執(zhí)行,需要傳入?yún)?shù),有提示在message函數(shù)里 #
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()總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
只需要100行Python代碼就可以實(shí)現(xiàn)的貪吃蛇小游戲
貪吃蛇小游戲相信80、90后小時(shí)候肯定都玩過,那么你知道如果通過Python來實(shí)現(xiàn)嗎?今天就來教大家,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們很有幫助,需要的朋友可以參考下2021-05-05
Python利用QQ郵箱發(fā)送郵件的實(shí)現(xiàn)方法(分享)
下面小編就為大家?guī)硪黄狿ython利用QQ郵箱發(fā)送郵件的實(shí)現(xiàn)方法(分享)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
端午節(jié)將至,用Python爬取粽子數(shù)據(jù)并可視化,看看網(wǎng)友喜歡哪種粽子吧!
端午節(jié)快要到了,旅游?回家?拜訪親友?少不了要帶上粽子.那么:選擇什么牌子的粽子呢?選擇什么口味的粽子呢?選擇什么價(jià)格區(qū)間呢?今天爬取了京東上面的 “粽子數(shù)據(jù)” 進(jìn)行分析,看看有啥發(fā)現(xiàn)吧!,需要的朋友可以參考下2021-06-06
Python循環(huán)取數(shù)組的值的方法實(shí)現(xiàn)
本文主要介紹了兩種Python中遍歷數(shù)組的方法,for循環(huán)和索引,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12
pandas中.loc和.iloc以及.at和.iat的區(qū)別說明
這篇文章主要介紹了pandas中.loc和.iloc以及.at和.iat的區(qū)別說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04
15個(gè)提升Python程序運(yùn)行速度的實(shí)用技巧
這篇文章主要為大家詳細(xì)介紹了15個(gè)提升Python程序運(yùn)行速度的實(shí)用技巧,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2026-01-01
淺談pycharm導(dǎo)入pandas包遇到的問題及解決
這篇文章主要介紹了淺談pycharm導(dǎo)入pandas包遇到的問題及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06
Python內(nèi)置的HTTP協(xié)議服務(wù)器SimpleHTTPServer使用指南
這篇文章主要介紹了Python內(nèi)置的HTTP協(xié)議服務(wù)器SimpleHTTPServer使用指南,SimpleHTTPServer本身的功能十分簡(jiǎn)單,文中介紹了需要的朋友可以參考下2016-03-03

