python如何写入dbf文件内容及创建dbf文件

 更新时间:2023年08月15日 09:01:39   作者: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()

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python使用pil生成图片验证码的方法

    python使用pil生成图片验证码的方法

    这篇文章主要介绍了python使用pil生成图片验证码的方法,涉及Python操作Image,ImageDraw,ImageFont等模块的相关技巧,需要的朋友可以参考下
    2015-05-05
  • Python定时任务sched模块用法示例

    Python定时任务sched模块用法示例

    这篇文章主要介绍了Python定时任务sched模块用法,结合实例形式分析了定时任务sched模块的基本功能、参数含义、多线程定时任务等相关操作技巧,需要的朋友可以参考下
    2018-07-07
  • Python将json文件写入ES数据库的方法

    Python将json文件写入ES数据库的方法

    这篇文章主要介绍了Python将json文件写入ES数据库的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值 ,需要的朋友可以参考下
    2019-04-04
  • python数据可视化Pyecharts库sankey修改桑葚图颜色

    python数据可视化Pyecharts库sankey修改桑葚图颜色

    这篇文章主要介绍了python数据化Pyecharts库sankey修改桑葚图颜色,文中有之前绘制桑葚图教程链接,本文就来修改一下桑葚图的颜色,有需要的朋友欢迎参阅借鉴
    2021-09-09
  • 如何使用Django(python)实现android的服务器端

    如何使用Django(python)实现android的服务器端

    这篇文章主要介绍了Django(python)简单实现android的服务器端,这里所需要的工具是PyCharm--python编辑工具,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • python决策树之CART分类回归树详解

    python决策树之CART分类回归树详解

    这篇文章主要为大家详细介绍了python决策树之CART分类回归树,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • pyenv命令管理多个Python版本

    pyenv命令管理多个Python版本

    这篇文章主要介绍了pyenv命令管理多个Python版本依赖环境的相关资料,需要的朋友可以参考下
    2017-03-03
  • 用Python写王者荣耀刷金币脚本

    用Python写王者荣耀刷金币脚本

    今天给大家带来的是用Python语言写一个关于手游王者荣耀刷金币的脚本,有兴趣的朋友参考学习下。
    2017-12-12
  • 浅谈anaconda python 版本对应关系

    浅谈anaconda python 版本对应关系

    这篇文章主要介绍了浅谈anaconda python 版本对应关系,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • Python对List中的元素排序的方法

    Python对List中的元素排序的方法

    这篇文章主要介绍了Python对List中的元素排序 ,需要的朋友可以参考下
    2018-04-04

最新评论