一、概述
本次案例使用的两份数据格式分别为csv和json,根据面向对象思想,可分别编写用于读取两类文件的类;并编写一个数据类,用来存储读取到的信息。
最后在程序主文件中,先建立数据库链接,通过链接对象执行SQL语句。新建两个空表用于存储这些数据--->插入数据,最后关闭链接即可。(新建表操作可以在MySQL图形化界面中进行,更加高效快捷,此处是为练习才使用python间接完成)
二、代码
"""
数据封装的类
"""
class Record:
def __init__(self, date, order_id, money, province):
self.date = date #销售日期
self.order_id = order_id #销售订单号
self.money = money #销售金额
self.province = province #销售省份
def __str__(self):
return f"{self.date}, {self.order_id}, {self.money}, {self.province}"
"""
文件读取类
"""
import json
from data_define import Record
#定义一个抽象类做顶层设计,确定需要实现的功能
class FileReader:
def read_data(self) -> list[Record]:
"""读取文件数据,将读到的每一条内容都转换为Record对象,并封装在list内返回"""
pass
#定义子类,用来读取文件
class TextFileReader(FileReader):
def __init__(self, path): #定义成员变量储存文件路径
self.path = path
def read_data(self) -> list[Record]: #复写父类方法(实现抽象方法)
f = open(self.path, "r", encoding="UTF-8")
record_list: list[Record] = [] #定义空列表,用于存放转换为Record类的数据,每行数据转换为一个Record类
for line in f.readlines():
line = line.strip() #删除字符串前后多余空格以及换行符
data_list = line.split(",")
record = Record(data_list[0], data_list[1], int(data_list[2]), data_list[3]) #将读到的每一条数据转换为Record类
record_list.append(record) #将数据对象封装到列表中
f.close() #关闭文件
return record_list
class JsonFileReader(FileReader):
def __init__(self, path):
self.path = path
def read_data(self) -> list[Record]:
f = open(self.path, "r", encoding="UTF-8")
record_list: list[Record] = []
for line in f.readlines():
data_dict = json.loads(line)
record = Record(data_dict["date"], data_dict["order_id"], int(data_dict["money"]), data_dict["province"])
record_list.append(record) # 将数据对象封装到列表中
f.close() # 关闭文件
return record_list
#测试模块
if __name__ == '__main__':
text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")
list1 = text_file_reader.read_data()
for l in list1:
print(l)
json_file_reader = JsonFileReader("D:/2011年2月销售数据JSON.txt")
list2 = json_file_reader.read_data()
for l in list2:
print(l)
"""
练习:利用pymysql库将文本文件数据写入MySQL数据库
"""
from data_define import Record
from file_define import *
from pymysql import Connection
#读取文件
#创建文件对象
text_file_reader = TextFileReader("D:/2011年1月销售数据.txt")
json_file_reader = JsonFileReader("D:/2011年2月销售数据JSON.txt")
#读取数据(返回list[Record])
jan_list = text_file_reader.read_data() #1月数据
feb_list = json_file_reader.read_data() #2月数据
#写入数据库
#构建数据库链接
conn = Connection(
host="localhost", #主机号(IP)
port=3306, #端口
user="root",
password="123456",
autocommit=True #插入数据自动确认
)
#构建游标对象
cursor = conn.cursor()
#选择数据库
conn.select_db("test")
#利用游标对象创建存储数据的表
cursor.execute("create table January_order_info("
"order_date date, order_id varchar(255), money int, province varchar(255));")
cursor.execute("create table February_order_info("
"order_date date, order_id varchar(255), money int, province varchar(255));")
#插入数据
#循环遍历一月数据的列表,取得每个record对象
for record in jan_list:
cursor.execute(f"insert into January_order_info values("
f"'{record.date}', '{record.order_id}', {record.money}, '{record.province}')")
for record in feb_list:
cursor.execute(f"insert into February_order_info values("
f"'{record.date}', '{record.order_id}', {record.money}, '{record.province}')")
#关闭链接
conn.close()
三、结果展示
表格存在test库中
一月销售数据表
二月销售数据表