本题目标:将text1,text2两个文件内的数据读取并处理,输出每日的销售额
以下为两个文件的内容(需要具体文件及python源文件可私信我)
一个为文本文件,另一个为json文件
本题解决思路:使用面向对象的思维完成数据读取和处理
以下是具体方法
分为三个python文件解决
main主文件
# 设计一个类完成数据的封装
# 设计一个抽象类,定义文件读取的相关功能,并使用子类实现具体功能
# 读取文件,产生数据对象
# 进行数据的逻辑计算(计算每天的销售额)
import json
from file_define import TextFileReader, JsonFileReader # 导入相关内容
from data_define import Record
text_file_reader = TextFileReader("D:\\python\\数据分析案例\\1销售数据.txt") # 调用TextFileReader类,并生成一个新的实例
json_file_reader = JsonFileReader("D:\\python\\数据分析案例\\2销售数据.txt") # 调用JsonFileReader类,并生成一个新的实例
jan_data: list[Record] = text_file_reader.read_date() # 用实例调用类中的read_date()方法
feb_data: list[Record] = json_file_reader.read_date() # 用实例调用类中的read_date()方法
all_data: list[Record] = jan_data + feb_data # 将两个数据合并为一个list存储
# 开始计算
data_dict = {} # 创建一个空字典用于求和
for record in all_data:
if record.date in data_dict.keys(): # record 是file_define里的实际调用Record类而形成的实际变量
data_dict[record.date] += record.money # 当前日期已经有记录了,和老记录做累加
else:
data_dict[record.date] = record.money # 当前日期没有记录,覆盖添加一个新的记录
pretty_json = json.dumps(data_dict, indent=4) # 通过json.dumps()函数可以将字典转换为JSON格式的字符串,并通过设置indent参数来美化输出
print(pretty_json)
data_define文件
class Record: # 记录
def __init__(self, date, order_id, money, province): # 类定义的init方法
self.date = date # 订单日期
self.order_id = order_id # 订单id
self.money = money # 订单金额
self.province = province # 订单省份
def __str__(self):
return f"{self.date}, {self.order_id}, {self.money},{self.province}" # 通过魔术方法__str__使得直接print是不再输出地址
file_define文件
"""
和文件相关的类定义
"""
import json
from data_define import Record # 将Record类导入
# 先定义一个抽象类用来做顶层设计,确定有哪些功能需要实现
class FileReader: # 一个抽象类,文件读取
def read_date(self) -> list[Record]: # 读取文件数据,并将读到的每一条数据都转换为Record对象,将它们都封装到list内返回
pass
class TextFileReader(FileReader): # 继承抽象类FileReader
def __init__(self, path): # 定义成员变量记录文件路径
self.path = path
def read_date(self) -> list[Record]: # 复写(实现抽象方法)父类的方法
record_list: list[Record] = []
f = open(self.path, "r", encoding="UTF-8") # 通过定义的成员变量path打开文件
for line in f.readlines(): # 通过for循环读取redalines读出的每一行内容
line = line.strip() # 通过strip函数去除字符串前后的转义字符\n
data_list = line.split(",") # 将每一行内的字符串用逗号隔开并形成一个新的列表存入data_list中
record=Record(data_list[0], data_list[1], eval(data_list[2]), data_list[3]) # 用实例调用Record类
record_list.append(record) # 将列表的内容追加到record_list中
f.close()
return record_list
class JsonFileReader(FileReader): # 继承抽象类FileReader
def __init__(self, path): # 定义成员变量记录文件路径
self.path = path
def read_date(self) -> list[Record]: # 复写(实现抽象方法)父类的方法
record_list: list[Record] = []
f = open(self.path, "r", encoding="UTF-8") # 通过定义的成员变量path打开文件
for line in f.readlines(): # 通过for循环读取redalines读出的每一行内容
data_dict= json.loads(line)
record=Record(data_dict["date"], data_dict["orderid"], eval(data_dict["money"]), data_dict["province"])
record_list.append(record) # 将用实例调用Record类的内容追加到record_list中
f.close()
return record_list
if __name__ == '__main__':
json_file_reader=JsonFileReader("2销售数据.txt")
text_file_reader=TextFileReader("1销售数据.txt")
list1=json_file_reader.read_date()
list2=text_file_reader.read_date()
for i in list2:
print(i)
for i in list1:
print(i)
最终输出结果:
{
“2011-01-01”: 6607,
“2011-01-02”: 10292,
“2011-01-03”: 8791,
“2011-01-04”: 11920,
“2011-01-05”: 10305,
“2011-01-06”: 5596,
“2011-01-07”: 5025,
“2011-01-08”: 8862,
“2011-01-09”: 11439,
“2011-01-10”: 12376,
“2011-01-11”: 9950,
“2011-01-12”: 8095,
“2011-01-13”: 8290,
“2011-01-14”: 11275,
“2011-01-15”: 8855,
“2011-02-03”: 5362,
“2011-02-04”: 11233,
“2011-02-05”: 5614,
“2011-02-06”: 9131,
“2011-02-07”: 8098,
“2011-02-08”: 3318,
“2011-02-09”: 5428,
“2011-02-10”: 7730,
“2011-02-11”: 7719,
“2011-02-12”: 10015,
“2011-02-13”: 8937,
“2011-02-14”: 12211,
“2011-02-15”: 7920
}