• 利用面向对象方法,处理数据文件【Python】


    题目背景:处理两份数据文件(文本数据和JSON数据),用面向对象的方法,效果图用柱状图呈现。

    本题思路:
    1.首先,创建一个【基础数据类】,名为Record,它将包含成员属性和成员方法。这个类将作为数据处理的基础结构。

    2.接着,创建一个【处理数据父类】,名为FileReader,它将包含成员方法,这个成员方法将被子类继承和实现(即为抽象方法)。

    3.然后,创建两个子类,分别是【文本数据类】和【JSON数据类】。这两个类将继承父类的成员方法(即为复写)。

    4.最后,在主函数体内,定义图形效果和数据整合处理。
    注:接下来的代码,将按照解题思路依次呈现。

    数据文件如下所示

    文本数据:
    在这里插入图片描述

    JSON数据文件:
    在这里插入图片描述

    代码如下:

    1.基础数据类(Record)

    #创建【基础数据类】,名为data_define.py文件
    class Record:
    	'''定义成员属性'''
    	def __init__(self,date,order_id,money,province):
    			self.date = date
    			self.order_id = order_id 
    			self.money = money
    			self.province = province
    
    	'''利用魔法方法str,将后续返回来的数据,处理为字符串'''
    	def __str__(self):
    			return f"{self.date},{self.order_id},{self.money},{self.province}"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    2.数据父类及两个子类

    #创建数据父类,名为file_define.py文件
    import json
    from data_define import Record
    
    #定义父类,方便后续子类复写,生成Record对象,并存为list列表
    class FileReader:
    	def read_data(self) -> list[Record]:
    			pass
    
    
    #处理文本内容文件:
    class TextFileReader(FileRearder):
        #定义成员变量
        def __init__(self,path):
            self.path = path        #文件路径
    
        #复写,父类的成员方法
        def read_data(self) -> list[Record]:
            f = open(self.path,"r",encoding="UTF-8")
            record_list = []
            
            for i in f.readlines():
                i = i.strip()
                data_list = i.split(",")
                record = Record(data_list[0],data_list[1],int(data_list[2]),data_list[3])
                record_list.append(record)
    
            f.close()
            return record_list
    
    
    #处理JSON文件内容
    class JsonFileReader(FileRearder):
        def __init__(self,path):
            self.path = path
    
        def read_data(self) -> list[Record]:
            f = open(self.path,"r",encoding="UTF-8")
            data_list = []
            for i in f.readlines():
                data_dict = json.loads(i)
                record = Record(data_dict["date"],data_dict["order_id"],int(data_dict["money"]),data_dict["province"])
                data_list.append(record)
    
            f.close()
            return data_list
    
    
    #测试(选写)
    if __name__ == '__main__':
        text_file_reader = TextFileReader("D:/不太重要的文档/Python/资料/资料/2011年1月销售数据.txt")
        t1 = text_file_reader.read_data()
    
        json_file_reader = JsonFileReader("D:/不太重要的文档/Python/资料/资料/2011年2月销售数据JSON.txt")
        t2 = json_file_reader.read_data()
    
    for i in t1:
    	print(i)
    
    for i in t2:
    	print(i)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61

    3.主体

    #将主函数,命名为main.py文件
    from file_define import *
    from data_define import *
    from pyecharts.charts import Bar
    from pyecharts.options import *
    from pyecharts.globals import ThemeType
    
    text_file_reader = TextFileReader("D:/不太重要的文档/Python/资料/资料/2011年1月销售数据.txt")
    jan_data: list[Record] = text_file_reader.read_data()
    
    
    json_file_reader = JsonFileReader("D:/不太重要的文档/Python/资料/资料/2011年2月销售数据JSON.txt")
    feb_data: list[Record] = json_file_reader.read_data()
    
    #将两个月份的数据,进行合并
    all_list = jan_data + feb_data
    
    #生成字典:{"2023-01-01":1234}.累加计算一天内的营业额
    data_dict = {}
    
    for i in all_list:
        if i.date in data_dict.keys():
            data_dict[i.date] += i.money
        else:
            data_dict[i.date] = i.money
    
    
    #生成可视化图表
    bar = Bar(init_opts=InitOpts(theme=ThemeType.LIGHT))
    
    bar.add_xaxis(list(data_dict.keys()))       #将时间 "2023-01-01" 作为X轴
    
    bar.add_yaxis("销售表",list(data_dict.values()),label_opts=LabelOpts(is_show=False))   #数值作为Y轴数据
    
    bar.set_global_opts(
        title_opts = TitleOpts(title="销售表")
    )
    
    bar.render()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    最后效果:
    在这里插入图片描述在这里插入图片描述

  • 相关阅读:
    【大数据】【Spark】Spark运行架构
    蓝牙助听模块场景分析之一
    (已导出) hyperv中的ubuntu虚拟机双网卡设置
    从 PC 解锁 Android 手机的 6 种有效方法
    事务的概念-事务的概念、事务的定义(BEGIN TRANSACTION、COMMIT、ROLLBACK)
    机器学习 | 基本概念梳理——数据集评估,任务,训练和测试,期望结果
    WebWall-04.CSRF(跨站请求伪造)
    【异常】springboot集成@Cacheable缓存乱码的问题解决方案
    Selenium隐藏浏览器和元素截屏实践
    【C# 基础精讲】try-catch语句块
  • 原文地址:https://blog.csdn.net/weixin_56105279/article/details/132852325