zoukankan      html  css  js  c++  java
  • 三酷猫自建文件数据库

    一 设计思想

    采用数据库设计思路,设计简易的 XML 数据库,来实现对数据的保存和读取。
    (1)软件通过index_database.xml文件统一为软件提供读、写服务。
    (2)index_database.xml文件详细记录了业务 XML 文件内容。
    (3)索引文件和业务文件构成了 Cat_Fish 数据库。

    二 代码实现

    建立通用的读写 XML 文件类,然后通过类实例来实现业务数据操作。

    2.1 建立读写 XML 文件类 FishDB

    (1)通过继承 bulid_XML.py 里的 BuildNewXML 类来实现写 XML 文件。
    build_XML.py 文件代码如下:

    import sys
    class BuildNewXML(): # 自定义建立XML文件类
        def __init__(self,filename = None):
            self.filename = filename
            self.__get_f = None # 自定义隐含属性(类内部使用)
        def openfile(self): # 自定义打开xml类函数openfile
            if self.filename == None:
                print('没有提供文件名!请提供建立文件的名称!!!')
                return False # 返回False并终止后续代码继续执行
            try:
                self.__get_f = open(self.filename,'a',encoding='utf-8') # 以追加写入方式打开一个文件,不存在则新建
            except:
                print('打开%s文件有问题!'%(self.filename))
                return False
        def writeXML(self,n,element): # 自定义写xml文件内容函数
            try:
                if n==0:
                    self.__get_f.write(element+'
    ') # 根元素写入
                else:
                    self.__get_f.write(' '*n+element+'
    ') # 子元素写入
            except:
                print('往%s文件写%s出错!'%(self.filename,element))
                sys.exit()
        def closeXML(self): # 自定义关闭文件函数
            if self.__get_f:
                self.__get_f.close() # 关闭文件
    #==============================================================================================
    filename = "storehouse.xml"
    flag = False # 判断xml文件操作是否正常标志
    content = {1:[0,'<storeHouse>'],
               2:[4,'<goods category="fish">'],
               3:[8,'<title>淡水鱼</title>'],
               4:[8,'<name>鲫鱼</name>'],
               5:[8,'<amount>18</amount>'],
               6:[8,'<price>8</price>'],
               7:[4,'</goods>'],  
               8:[4,'<goods category="fruit">'],
               9:[8,'<title>温带水果</title>'],
               10:[8,'<name>猕猴桃</name>'],
               11:[8,'<amount>10</amount>'],
               12:[8,'<price>10</price>'],
               13:[4,'</goods>'],
               14:[0,'</storehouse>']
                  }
    build_xml = BuildNewXML(filename) # 调用BuildNewXML类对象,即实例化一个对象,传递文件名
    try:
        build_xml.openfile() # 实例调用方法
        for get_item in content.items(): # 循环读取要写入的字典对象元素
            build_xml.writeXML(get_item[1][0],get_item[1][1]) # 写入xml文件
        flag = True # 写正常,标志为True
    except:
        print('文件写入错误,退出程序')
        sys.exit() # 退出程序
    finally:
        if flag: # 写xml文件正常
            build_xml.closeXML() # 正常关闭
            print('往%s写内容完成!'%(filename))
    

    (2) 建立 FishDB(FishDB_class.py)类

    import os
    from build_XML import BuildNewXML
    class FishDB(BuildNewXML): # 继承并定义新类FishDB
        def __init__(self,filename=None):
            super().__init__(filename=None) # 继承实现父类与子类的关联
            self.path = '' # 定义路径属性
        def check_path(self): # 确保先建立指定的文件路径
            try:
                if self.path == '':
                    print('请先设置正确的路径名,再执行代码!')
                    return
                elif not os.path.isdir(self.path): # 如果路径不存在
                    os.makedirs(self.path) # 建立对应的新路径
                self.filename = self.path + self.filename
            except:
                print('子文件夹%s建立出错!'%(self.path))
    

    2.2 通过类实例来实现业务数据写操作

    引用 FishDB 写业务数据 (Write_FishDB.py)

    from FishDB_class import FishDB # 导入自定义类FishDB
    content1={1:[0,'<fish day="2018-1-1">'],
             2:[4,'<goods>'],
             3:[8,'<name>鲫鱼</name>'],
             4:[8,'<amount>17</amount>'],
             5:[8,'<price>10.5</price>'],
             6:[4,'</goods>'],
             7:[4,'<goods>'],
             8:[8,'<name>鲤鱼</name>'],
             9:[8,'<amount>8</amount>'],
             10:[8,'<price>6.2</price>'],
             11:[4,'</goods>'],
             12:[4,'<goods>'],
             13:[8,'<name>鲢鱼</name>'],
             14:[8,'<amount>7</amount>'],
             15:[8,'<price>4.7</price>'],
             16:[4,'</goods>'], 
             17:[0,'</fish>']}
    content2={1:[0,'<fish day="2018-1-2">'],
             2:[4,'<goods>'],
             3:[8,'<name>草鱼</name> '],
             4:[8,'<amount>2</amount>'],
             5:[8,'<price>7.2</price>'],
             6:[4,'</goods>'],
             7:[4,'<goods>'],
             8:[8,'<name>鲫鱼</name> '],
             9:[8,'<amount>3</amount>'],
             10:[8,'<price>12</price>'],
             11:[4,'</goods>'],
             12:[4,'<goods>'],
             13:[8,'<name>黑鱼</name> '],
             14:[8,'<amount>6</amount>'],
             15:[8,'<price>15</price>'],
             16:[4,'</goods>'],
             17:[0,'</fish>']}
    content3={1:[0,'<fish day="2018-1-3">'], 
             2:[4,'<goods>'],
             3:[8,'<name>乌鱼</name> '],
             4:[8,'<amount>1</amount>'],
             5:[8,'<price>78.10</price>'],
             6:[4,'</goods>'],
             7:[4,'<goods>'],
             8:[8,'<name>鲫鱼</name> '],
             9:[8,'<amount>1</amount>'],
             10:[8,'<price>10.78</price>'],
             11:[4,'</goods>'],
             12:[4,'<goods>'],
             13:[8,'<name>草鱼</name> '],
             14:[8,'<amount>5</amount>'],
             15:[8,'<price>7.92/price>'],
             16:[4,'</goods>'],
             17:[0,'</fish>']}
    new_xml=FishDB() # 建立FishDB类实例
    DBRecord=[] #索引记录
    DBRecord.append([0,'<DBrecord">']) # 记录根元素开始标签
    def writeDBrecord(DBR,no,filename,path,date,dbName): # 自定义记录子节点内容 
        DBR.append([4,'<record>'])
        DBR.append([8,'<no>'+str(no)+'</no>'])
        DBR.append([8,'<filename>'+filename+'</filename>'])
        DBR.append([8,'<path>'+path+'</path>'])
        DBR.append([8,'<date>'+date+'</date>'])
        DBR.append([8,'<dbName>'+dbName+'</dbName>'])   
    #====================写入2018年1月1日的钓鱼记录
    filename="Fish_record1.xml"
    new_xml.filename="\"+filename # 类的文件名属性
    new_xml.path="d:cat_fish" # 类的路径属性
    new_xml.check_path() # 类调用check_path方法
    flag=False
    try:
        new_xml.openfile() # 实例调用方法
        for get_item in content1.items(): # 循环读取要写入的字典对象元素
            new_xml.writeXML(get_item[1][0],get_item[1][1])
            flag=True
    except:
        print('文件写入错误,退出程序!')
        sys.exit()
    finally:
        if flag: # 写XML文件正常
            new_xml.closeXML()
            print('往%s写内容完成!'%(filename))
            writeDBrecord(DBRecord,1,'Fish_record1.xml','d:cat_fish','2018-1-1','Cat_Fish')
    #====================写入2018年1月2日的钓鱼记录
    filename="Fish_record2.xml"
    new_xml.filename="\"+filename
    new_xml.path="d:cat_fish"
    new_xml.check_path()
    flag=False
    try:
        new_xml.openfile()
        for get_item in content2.items():
            new_xml.writeXML(get_item[1][0],get_item[1][1] )
            flag=True
    except:
        print('往文件内容出错,退出程序!')
        sys.exit()
    finally:
        if flag:
            new_xml.closeXML()
            print('往%s写内容完成!'%(filename))
            writeDBrecord(DBRecord,2,'Fish_record2.xml','d:cat_fish','2018-1-2','Cat_Fish')
    #====================写入2018年1月3日的钓鱼记录
    filename="Fish_record3.xml"
    new_xml.filename="\"+filename
    new_xml.path="d:cat_fish"
    new_xml.check_path()
    flag=False
    try:
        new_xml.openfile()
        for get_item in content3.items():
            new_xml.writeXML(get_item[1][0],get_item[1][1] )
            flag=True
    except:
        print('往文件内容出错,退出程序!')
        sys.exit()
    finally:
        if flag:
            new_xml.closeXML()
            print('往%s写内容完成!'%(filename))
            writeDBrecord(DBRecord,3,'Fish_record3.xml','d:cat_fish','2018-1-3','Cat_Fish')
    DBRecord.append([0,'</DBrecord">'])
    #====================写入索引记录
    filename="index_database.xml"
    new_xml.filename="\"+filename
    new_xml.path="d:cat_fish"
    new_xml.check_path()
    flag=False
    try:
        new_xml.openfile()
        for get_item in DBRecord:
            new_xml.writeXML(get_item[0],get_item[1])
            flag=True
    except:
        print('往文件内容出错,退出程序!')
        sys.exit()
    finally:
        if flag:
            new_xml.closeXML()
            print('往%s写内容完成!'%(filename))
    

    三 代码执行结果

    D:cat_fish下的文件夹

    正是江南好风景
  • 相关阅读:
    从一个整数数组中取出最大的整数,最小整数,总和,平均值
    9、数组知识点小结
    结构类型小结
    枚举类型小结
    asp.net MVC 笔记
    Android自动化测试之Shell脚本一——模拟触屏事件
    Android性能优化案例研究
    ViewHolder模式的简洁写法
    genymotion ddms查看data等文件目录
    Android事件传递机制
  • 原文地址:https://www.cnblogs.com/monsterhy123/p/12973365.html
Copyright © 2011-2022 走看看