Python计算全班所购买的书本费

作为团支书和班长,全班的资料和数据过多,虽然办公软件能够解决许多数据处理问题,但自身学习编程这项专业,就要体现出本专业的水平,并且每一个学期都需要统计全班有哪些同学买哪些书,每个学期都拿办公软件去计算,会消耗大量时间,我本人就想着,编一个计算全班书本费的程序,每个学期统计好数据后,直接让Python自己计算,能省不少时间。

希望这个小程序能够对你有帮助。


目录

一、准备工作

二、代码阶段

1.库(xlrd)的使用

2.获取数据

运行结果:

3.处理数据

        输出结果如下(字典的形式):

4.数据计算

最最最最最重要的一步,程序计算!!!

输出结果:

三、全部代码


一、准备工作

首先当然得获取到全班同学所购买的书籍数据,然后程序才可以读取到数据并计算。

这里我使用的是.xlsx文件形式(本程序使用的是读取Excel表格的形式)。

注意:这里一定要确保是以姓名之后是课程的顺序,关于B列姓名、C列课程,列可以不同。(如果不同一定要在代码中修改,否则程序读取不到数据!!!)


二、代码阶段

既然有了数据,那么就开始Python的程序计算。

1.库(xlrd)的使用

在这里需要说明一下,pip默认安装的库都是最新版本,而xlrd的最新版本是不支持xlsx文件的,需要将xlrd回退到1.2.0版本

import xlrd

如果你的电脑中已安装最新版xlrd库,那么就要将它先删除。

你这可以直接找到xlrd的库文件,将它删除,也可在cmd中使用:

pip uninstall xlrd

安装旧版本的xlrd时,同样在cmd下,在末尾加上参数:

pip install xlrd==1.2.0

2.获取数据

def work_book():    # 获取表格对象
    file = open("折扣Book.txt", "w")
    resort = xlrd.open_workbook("工作簿1.xlsx")    # 文件路径
    sheet = resort.sheet_by_index(0)    # 获取sheet对象
    """
    获取工作簿名,工作表行、列数
    """
    table = sheet.name    # 获取工作表的名称
    count_line = sheet.nrows    # 获取行数
    clos = sheet.ncols        # 获取列数
    print("工作表" + table, count_line, '行', clos, '列\n', end=" ")
    
    """
    如果你的表格中,姓名不在B列,课程的书本不在C列,
    而是姓名在A列,课程书本在B列,那么就要将下面的
    书本名称: sheet.row_values(i)[1]  中的 1 改成0 或你对应的姓名列数
    Python循环默认以0开头,如:0,1,2,3,4,5,6,7,8,9
    所以A列对应的是0,依此类推。
    """

    for i in range(count_line):
        read_line_book = sheet.row_values(i)[2].split("、")        
        # 获取书本名称,用中文顿号分割
        read_line_name = sheet.row_values(i)[1]
        # 获取姓名
        file.writelines(read_line_name + ',' + ",".join(read_line_book) + "\n")
    file.close()
# work_book()    # 读取数据时,需要将注释删除,调用work_book()

这里的数据我们保存在自定义的文本文件中。

运行结果:

 存储的文件内容:

这里注意:每一位同学所购买都会有多有少,也有没买的(这里统一指自己购买)。

3.处理数据

def File():
    file = open("折扣Book.txt", "r")  # 打开work_book中创建的文本文件
    txt = file.read()
    dic = {}    # 创建字典,对应人员书本
    for i in txt.split("\n")[1:]:
        new_txt = i.split(",")
        if new_txt[0] != "" or new_txt[-1] != "":
            del_txt = new_txt
            dic[del_txt[0]] = del_txt[1:]
    print(dic)  # 将读取出来的内容,复制到Sum()当中,开始计算
    file.close()
# File()

在这里的for循环中, 因为在work_book中我们将读取出来的数据保存为文本文件(上图打开的记事本)的格式。

我可以看到每一个人程序都将它换行处理了,而我们需要的是读取每一个人的姓名以及对应的课程,放入字典中,星成键(姓名)对值(书本)。

        输出结果如下(字典的形式):

4.数据计算

然后我们就要将上面File()出来的数据复制下来,另存到Sum()当中。

最最最最最重要的一步,程序计算!!!

def Sum():      # 计算个人金额
    lst = {
        '***': ['MySQL数据库技术与项目', '大学生创新创业基础教程', 'linux网络操作系统'],
        '***': ['MySQL数据库技术与项目', '大学生创新创业基础教程', '慧通职场英语']
            }

    """
    lst作为少量数据计算的测试,若成功计算出结果,则使用ls计算全班的书本费
    """

    ls = {
        '***': ['MySQL数据库技术与项目', '大学生创新创业基础教程', 'linux网络操作系统'],
        '***': ['MySQL数据库技术与项目', '大学生创新创业基础教程', '慧通职场英语'],
    }
    """
    将每一本书对应的金额设置参数,设为float值,每个书本起始值为0元,用for循环遍历字典中的键对值,
    因为这里的书本内容是以字典的方式存储,所以算起来更加的方便。
    """

    MySQL_book, MySQL_book_money, MySQL_book_sum = 'MySQL数据库技术与项目', float(34.20), float(0)
    Sinnovation_book, Student_innovation_money, Sinnovation_sum = '大学生创新创业基础教程', float(30.32), float(0)
    Java_book, Java_book_money, Java_book_sum = "java基础入门", float(45.45), float(0)
    Linux_book, Linux_book_money, Linux_book_sum = "linux网络操作系统", float(37.85), float(0)
    English_book, English_book_money, English_book_sum = "慧通职场英语", float(35.57), float(0)
    Politics_book, Politics_book_money, Politics_book_sum = "新编普通高等学校军事课教程", float(30.25), float(0)
    NoSQL_book, NoSQL_book_money, NoSQL_book_sum = "NoSQL数据库技术与应用", float(60.65), float(0)
    sum_book = float(0)
    # 这里的sum_book作为每一次判断运算

    w = open("教材统计.txt", "w", encoding="UTF-8")

    """
    每一次遍历循环判断此人是否包含对应的书,然后计算个人书本费
    """

    for i in ls.items():
        for j in range(2):
            if len(i) != 0:
                if MySQL_book in i[j]:
                    MySQL_book_sum += (sum_book + MySQL_book_money)
                if Sinnovation_book in i[j]:
                    Sinnovation_sum += (sum_book + Student_innovation_money)
                if Java_book in i[j]:
                    Java_book_sum += (sum_book + Java_book_money)
                if Linux_book in i[j]:
                    Linux_book_sum += (sum_book + Linux_book_money)
                if English_book in i[j]:
                    English_book_sum += (sum_book + English_book_money)
                if Politics_book in i[j]:
                    Politics_book_sum += (sum_book + Politics_book_money)
                if NoSQL_book in i[j]:
                    NoSQL_book_sum += (sum_book + NoSQL_book_money)
        count = "{}所购买书籍{}\n个人金额(折扣后的价格):{:.2f}元\n".format(
                        i[0], i[1], MySQL_book_sum + Sinnovation_sum + NoSQL_book_sum +
                        Linux_book_sum + Java_book_sum + Politics_book_sum + English_book_sum
                                                                                                        )
        print(count)
        MySQL_book_sum, \
        Sinnovation_sum,\
        NoSQL_book_sum,\
        Linux_book_sum,\
        Java_book_sum,\
        Politics_book_sum,\
        English_book_sum = float(0), float(0), float(0), float(0), float(0), float(0), float(0)
        w.writelines(count)
# Sum()

输出结果:

 并且会在程序的目录下创建已经计算好书本费的文本文件。

三、全部代码

import xlrd

def work_book():    # 获取表格对象
    file = open("折扣Book.txt", "w")
    resort = xlrd.open_workbook("工作簿1.xlsx")    # 文件路径
    sheet = resort.sheet_by_index(0)    # 获取sheet对象
    """
    获取工作簿名,工作表行、列数
    """
    table = sheet.name
    count_line = sheet.nrows
    clos = sheet.ncols
    print("工作表" + table, count_line, '行', clos, '列\n', end=" ")

    for i in range(count_line):
        read_line_book = sheet.row_values(i)[2].split("、")
        read_line_name = sheet.row_values(i)[1]
        file.writelines(read_line_name + ',' + ",".join(read_line_book) + "\n")
    file.close()
# work_book()

def File():
    file = open("折扣Book.txt", "r")  # 打开work_book中创建的文本文件
    txt = file.read()
    dic = {}    # 创建字典,对应人员书本
    for i in txt.split("\n")[1:]:
        new_txt = i.split(",")
        if new_txt[0] != "" or new_txt[-1] != "":
            del_txt = new_txt
            dic[del_txt[0]] = del_txt[1:]
    print(dic)  # 将读取出来的内容,复制到Sum()当中,开始计算
    file.close()
# File()

def Sum():      # 计算个人金额
    lst = {
        '***': ['MySQL数据库技术与项目', '大学生创新创业基础教程', 'linux网络操作系统'],
        '***': ['MySQL数据库技术与项目', '大学生创新创业基础教程', '慧通职场英语']
            }
    ls = {
        '***': ['MySQL数据库技术与项目', '大学生创新创业基础教程', 'linux网络操作系统'],
        '***': ['MySQL数据库技术与项目', '大学生创新创业基础教程', '慧通职场英语'],
    }
    """
    将每一本书对应的金额设置参数,设为float值,每个书本起始值为0元,用for循环遍历字典中的键对值,
    因为这里的书本内容是以字典的方式存储,所起算起来更加的方便。
    """
    MySQL_book, MySQL_book_money, MySQL_book_sum = 'MySQL数据库技术与项目', float(34.20), float(0)
    Sinnovation_book, Student_innovation_money, Sinnovation_sum = '大学生创新创业基础教程', float(30.32), float(0)
    Java_book, Java_book_money, Java_book_sum = "java基础入门", float(45.45), float(0)
    Linux_book, Linux_book_money, Linux_book_sum = "linux网络操作系统", float(37.85), float(0)
    English_book, English_book_money, English_book_sum = "慧通职场英语", float(35.57), float(0)
    Politics_book, Politics_book_money, Politics_book_sum = "新编普通高等学校军事课教程", float(30.25), float(0)
    NoSQL_book, NoSQL_book_money, NoSQL_book_sum = "NoSQL数据库技术与应用", float(60.65), float(0)
    sum_book = float(0)
    w = open("教材统计.txt", "w", encoding="UTF-8")

    """
    每一次遍历循环判断此人是否包含对应的书,然后计算个人书本费
    """
    for i in ls.items():
        for j in range(2):
            if len(i) != 0:
                if MySQL_book in i[j]:
                    MySQL_book_sum += (sum_book + MySQL_book_money)
                if Sinnovation_book in i[j]:
                    Sinnovation_sum += (sum_book + Student_innovation_money)
                if Java_book in i[j]:
                    Java_book_sum += (sum_book + Java_book_money)
                if Linux_book in i[j]:
                    Linux_book_sum += (sum_book + Linux_book_money)
                if English_book in i[j]:
                    English_book_sum += (sum_book + English_book_money)
                if Politics_book in i[j]:
                    Politics_book_sum += (sum_book + Politics_book_money)
                if NoSQL_book in i[j]:
                    NoSQL_book_sum += (sum_book + NoSQL_book_money)
        count = "{}所购买书籍{}\n个人金额(折扣后的价格):{:.2f}元\n".format(
                        i[0], i[1], MySQL_book_sum + Sinnovation_sum + NoSQL_book_sum +
                        Linux_book_sum + Java_book_sum + Politics_book_sum + English_book_sum
                                                                                                        )
        print(count)
        MySQL_book_sum, \
        Sinnovation_sum,\
        NoSQL_book_sum,\
        Linux_book_sum,\
        Java_book_sum,\
        Politics_book_sum,\
        English_book_sum = float(0), float(0), float(0), float(0), float(0), float(0), float(0)
        w.writelines(count)
Sum()

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值