《黑马程序员Python课程》P138课后作业:通过Python读取MySQL数据,反向写出文件

(从个人理解写出,不妥之处请批评指正!)

在视频之前的代码基础上:

        1.data_define.py未更改

        2.file_define.py未更改

        3.main.py有更改

具体如下:

1.data_define.py

"""
数据定义的类
"""

class Record:

    def __init__(self, date, order_id, money, province):
        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}'

2.file_define.py

"""
和文件相关的类定义
"""
import json

from data_define import Record

# 定义抽象类作顶层设计,确定需要实现的功能
class FileReader:
    def read_data(self) -> list[Record]:
        # 读取文件数据,并将每一条数据转换为Reader对象,都封装到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] = []
        for line in f.readlines():
            line = line.strip()             # 消除每一行的\n
            data_list = line.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

# 子类二
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


3.main.py

from pymysql import Connection

# 构建SQL链接
conn = Connection(
    host='localhost',    # 本机
    port=3306,         # 端口
    user='root',         # 账户
    password='2020',     # 密码
    autocommit=True      # 自动提交
)

cursor = conn.cursor()      # 创建游标
conn.select_db('test')      # 选择数据库

# 查询数据传入results
cursor.execute("select * from orders")
results = cursor.fetchall()

# 将数据写入文件
data_dict = {}
f = open("D:/1研究生学习/Python学习/2月销售数据.txt", "a", encoding="utf-8")
for r in results:
    data_dict["date"] = str(r[0])
    data_dict["order_id"] = r[1]
    data_dict["money"] = r[2]
    data_dict["province"] = r[3]
    data = json.dumps(data_dict, ensure_ascii=False)    # 将字典转化为JSON类型
    f.write(data)
    f.write("\n")

f.flush()       # 刷新文件
f.close()       # 关闭文件
conn.close()    # 关闭链接


main.py中需要注意的地方:

        (1)我创建的数据库名称是“test”,选择数据库时请自行更改。

        (2)关于for循环中data_dict["date"] = str(r[0])的解释

        先替换运行如下代码:        

# 将数据写入文件
data_dict = {}
for r in results:
    data_dict["date"] = str(r[0])
    data_dict["order_id"] = r[1]
    data_dict["money"] = r[2]
    data_dict["province"] = r[3]
    print(r)

conn.close()    # 关闭链接

可以看到输出如下

日期其实是datetime.date格式,因此要转为字符格式,再写入字典

最终结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值