作为团支书和班长,全班的资料和数据过多,虽然办公软件能够解决许多数据处理问题,但自身学习编程这项专业,就要体现出本专业的水平,并且每一个学期都需要统计全班有哪些同学买哪些书,每个学期都拿办公软件去计算,会消耗大量时间,我本人就想着,编一个计算全班书本费的程序,每个学期统计好数据后,直接让Python自己计算,能省不少时间。
希望这个小程序能够对你有帮助。
目录
一、准备工作
首先当然得获取到全班同学所购买的书籍数据,然后程序才可以读取到数据并计算。
这里我使用的是.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()