办公需求:
开学了,周计划教案的模板又要调整了。其中“分散活动”的内容需要按一定排序规律,每周填入不同的场地。
为了避免每个班级每天用的场地产生重复,组长制定了场地安排规则。
以大八班为例,
1.第1周(周一到周五)的场地:
“8号对战投投乐”“”1号场地山洞大冒险““2号场地小小交通车””“3号场地爬龙接力赛”和“4号百变小能手”
2.第2周(周一到周五)的场地:
”1号场地山洞大冒险““2号场地小小交通车””“3号场地爬龙接力赛”和“4号百变小能手”“5号平衡小勇士”“
2.第3周(周一到周五)的场地:
““2号场地小小交通车””“3号场地爬龙接力赛”和“4号百变小能手”“5号平衡小勇士”“”6号跑跳小达人‘
依次类推……
操作需求:
作为周计划中相对固定有规律的填写内容,我会首先考虑将它们填写完成。但是通知中只有两条提示“第一周81234,第二周12345”,实际填写中,我还是需要按周次把场地数字一一写出来(写出20周的5组数字),然后按索引去拷贝相应的填写内容……在学习了Python后,我再也不想手动完成这类机械的工作。
实践过程:
第一步:个人尝试
我套用风变编程基础课的“轮流排座位“代码,写出了大8班的20周每周5天的场地排序列表。(下图)
问题:但是用已知方法都无法把终端里生成的值保存的TXT或者excel里。
二、高手指导
无奈之下,只能再次求助马先生。马先生用两天时间20220219-20220220陆续写了六个py代码。将全部8个班级20周的场地随机、样式随机、班号、周次等信息逐行保存,使用map、zip、enumerate等参数,成功将数据保存到不同抬头的xls内。
问题:六款代码使用和反复引用列表,让我对马先生的高超的编程技术叹为观止。虽然我也尝试注释,但短时间内还是吃不透原理,不会应用。
第三步:套用保存部分代码
于是我尝试直接将马先生代码的“xls保存”部分的代码套用到“轮流排座位”的代码里,希望能让终端里的列表值逐行导入到excel,便于黏贴到周计划教案模板的相应位置。
马先生的代码太使用了。经过微调,就顺利获得了一个班级(大8班)的20周运动场地的excel结果。
1.代码(第一种保存方法)
import sys import random import xlrd import xlwt from openpyxl import load_workbook # # list2=int(input('你班级第1周第1天的运动场地数字(不同班级不同的起始数字')) # 作者:阿夏 # 第一步:大八班运动项目的范围 对战投投乐=8,山洞大探险=1,大8第1周周一从“战投投乐”开始,所以list内把对战投投乐放在第一个。 list=['对战投投乐(弹力球 吸盘球 飞镖盘)','山洞大探险(滑索、轮胎、水桶)', '小小交通车(指示牌、各种车类)','爬笼接力赛(爬笼树屋、书包铃铛)', '百变小能手(小足球、垫子、马甲)','平衡小勇士(竹梯、三脚架、垫子等)', '跑跳小达人(轮胎、跨栏、接力棒','勇敢者道路(背篓、布袋、小动物)'] # list=['a','b','c','d','e','f','g','h']# 八个场地八个班 # 以下选取每周5个 list2=[]# 取空列表 for i in range(1):#共20周这是第1周,是原始的位置81234 list1=list print(list[0:5]) # 列表有8个运动项目,但只要其中5个(周一到周五) list2.append(list[0:5]) for i in range(2,21): #共20周 这是第2-20周 ,如果是21周,把2,21 改成2,22 list1=list[0] # 获取第一个a list=list[1:] # a暂时离开,后面的号码都进一位。 list.append(list1) # 将a安排到最后一个座位 print(list[0:5]) # 列表是八个循环,我只要其中5个 list2.append(list[0:5]) # 以下是xls保存(作者:马清新) arrlan = len(list2)# list2是终端显示的列表值 workbook = xlwt.Workbook()# 新建xls工作簿 sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet row = 21 # 共20周 写21行才会只出20条,若row = 0时,excel循环保存400条 for k in range(arrlan): for i,item in enumerate(list2,0): # 没有list2[k] 的K,就不会被拆分成一个字一个字 i=键lists item=0 # print(i) # print(item) if k == 0: # 从0行开始写入 for j,value in enumerate(item,0): # j=item print(i,j,value) sheet.write(i,j,value) row += 1 else: for j,value in enumerate(item,0): # if value in list2[k][0]: # pass # else: # print(row,j,value) sheet.write(row,j,value) row += 1 # 每段都有抬头 #本段只保存每周5天场地文字,第一行没有星期,第一列没有周次和班级 try: workbook.save(r"D:\test\分散运动的循环\大8班分散运动.xls") # 新建保存 只能xls print('计划生成成功') except e: print('失败...') print(e)
第二种xls保存方法(简化代码 推荐使用)
import sys
import random
import xlrd
import xlwt
from openpyxl import load_workbook
# # list2=int(input('你班级第1周第1天的运动场地数字(不同班级不同的起始数字'))
# 第一步:大八班运动项目的范围 对战投投乐=8,山洞大探险=1,大8第1周周一从“战投投乐”开始,所以list内把对战投投乐放在第一个。
list=['对战投投乐(弹力球 吸盘球 飞镖盘)','山洞大探险(滑索、轮胎、水桶)',
'小小交通车(指示牌、各种车类)','爬笼接力赛(爬笼树屋、书包铃铛)',
'百变小能手(小足球、垫子、马甲)','平衡小勇士(竹梯、三脚架、垫子等)',
'跑跳小达人(轮胎、跨栏、接力棒','勇敢者道路(背篓、布袋、小动物)']
# list=['a','b','c','d','e','f','g','h']# 八个场地八个班
# 以下选取每周5个
list2=[]# 取空列表
for i in range(1):#共20周这是第1周,是原始的位置81234
list1=list
print(list[0:5]) # 列表有8个运动项目,但只要其中5个(周一到周五)
list2.append(list[0:5])
for i in range(2,21): #共20周 这是第2-20周 ,如果是21周,把2,21 改成2,22
list1=list[0] # 获取第一个a
list=list[1:] # a暂时离开,后面的号码都进一位。
list.append(list1) # 将a安排到最后一个座位
print(list[0:5]) # 列表是八个循环,我只要其中5个
list2.append(list[0:5])
# 以下是xls保存的简化方法
arrlan = len(list2)# list2是终端显示的列表值
workbook = xlwt.Workbook()# 新建xls工作簿
sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet
row = 0# 保存的简化方法
for i in range(arrlan):
for col,item in enumerate(list2[i],0):
sheet.write(row,col,item)
row += 1
try:
workbook.save(r"D:\test\分散运动的循环\大8班分散运动.xls") # 新建保存 只能xls
print('计划生成成功')
except e:
print('失败...')
print(e)
2.xls的结果(只有20周每行5个运动项目)
3.xls的手工验证
手工验证表的蓝色部分 第1周“对 山 小 爬 百” 第20周“爬 百 平 跑 勇”与 大8班分散运动的蓝色部分 第1周“对 山 小 爬 百” 第20周“爬 百 平 跑 勇敢”内容完全一直,证明这个代码跑出来的数据符合场地安排规则表的要求。
不足之处:代码只能生成1个班(大8班),要替换其他班级,就要手工修改list=【‘’】中场地的位置,这点需要优化。
end
下一步要解决的内容:
1、“轮流排座位”的代码基础上:
(1)xls表格有班级号及周次
(2)输入“大1班” ,获得符合大1班需求的‘大1班分散运动.xls'
(3)批量生成大1-8的所有xls(分开的或者在一份表格里。)
解决:参考马的六个代码
2、马的六个代码原理解读、运用
3、把list列表里的内容通过xls进行调用的方法