效果样式:8个班级不同的建构游戏排列
背景需求:
2022年上学期作过一份大班游戏活动室排班表——班主任版21周(手动删除)
改良代码:
现在是2022年下学期,发现活动室排版内容与上学期相同
不同之处:
- 周次:上学期21周,本学期20周。
所以代码里面就加了一个w=int(input('共有几周?(如20周)\n')),其余不变
- 周次数量:
上次批量生成的有多余内容,因为设置了8次*3,所以需要手动删除
上一份的代码 循环3次,所以固定是24周
本次代码修改:
5个5个取值并写入XLS
代码展示:
20230217 2022学年下学期“大班游戏活动室排班表——班主任版20周”(python 排班表系列)
#20230217 2022学年下学期大班活动室安排(8个班级 不跳节日)
import sys
import random
import xlrd
import xlwt
from openpyxl import load_workbook
import time
time.sleep(2)
'''班主任贴周计划用的(按班级分类)'''
weekweek=int(input('共有几周?(如20周,20)\n'))2
print('---------第1步:把8个活动室游戏活动室循环21次(105元素组成的列表)------')
# 本学期:大1,大2,大3,大4,大5,大7,大8,大9班,其中6班空缺,一共有8个大班
gradenum=['1','2','3','4','5','7','8','9']
# print(len(gradenum))# 8
# radenum的长度=7,0-7,一共循环8次
for num in range(0,len(gradenum)):
L=[]# 这里的L等于list,因为和最后excle合并程序中的代码有冲突,所以全部改成大写的首字母
L1=[]
L3=[]
L2=[]
L4=[]
# 这里是8个活动室游戏活动室,因为后面有递进,所以把最后一个 08,放到01前面,这样摆放后面才会正确)
L3=['角色游戏','建构游戏','沙水游戏','角色游戏','表演游戏','角色游戏','表演游戏','建构游戏',]
# 生成8个班级8组活动室(第1个元素不同)
for i in range(0,len(gradenum)): #
b = L3.pop(0) # 在活动室游戏活动室列表L3中 删除 第1个元素 大1班 先删除08,就是从01开始
L3.append(b) # 在活动室游戏活动室列表L3最后 添加 第1个元素
# print(L[0])
L1.append(L3[0:len(gradenum)]) # 把不断变化的内容添加到L1
# 8个班级游戏活动室“基本元素“构成了L1列表:[['01', '02', '03', '04', '05', '06', '07', '08'], ['02', '03', '04', '05', '06', '07', '08', '01'], ['03', '04', '05', '06', '07', '08', '01', '02'], ['04', '05', '06', '07', '08', '01', '02', '03'], ['05', '06',
# print(L1)
for b in range(21): # 把各班“游戏活动室基本元素8个”循环21次,数量多一点,便于后期提取内容
for y in L1[num]: #抽取L1中的一组组内容 L1[0]=['01', '02', '03', '04', '05', '06', '07', '08']、L1[1]=['02', '03', '04', '05', '06', '07', '08', '01'],
# print(y) # 在用 y提取L1[0]中的'01', '02', '03', '04', '05', '06', '07', '08'三个元素
L.append(y) #把y提取的单个元素一个个加到列表里,并且依次循环22次,数量足够多
# print(L)
# 打印出来大1班 列表组=['01', '02', '03', '04', '05', '06', '07', '08','01', '02', '03', '04', '05', '06', '07', '08','01', '02', '03', '04', '05', '06', '07', '08','01', '02', '03', '04', '05', '06', '07', '08','01', '02', '03', '04', '05', '06', '07', '08']
print('---------第2步:如果一周有5天(不考虑跳过假日)------')
#
print('大{}班'.format(gradenum[num]))
for i in range(0,weekweek):#第1周
L2.append(L[5*i:5*i+5])
# print('---------第3步:如果每周需要跳过假日(考虑跳过假日)------')
# # 每周需要的天数 (跳过节日.如第1周只有2天工作,9月1-2日(周四周五) ,第3周周一是中秋节放假1天,所以只有4个工作日)
# day=['2','5','4','5','5','2','5','5','5','5','5','5','5','5','5','5','5','4','5','5','2']
# print('大{}班'.format(gradenum[num]))
# # 第1周
# for d in range(0,1): # d=索引数字
# print(L[0:int(day[0])]) # 列表有8个活动室项目,但只要其中5个(周一到周五)
# L2.append(L[0:int(day[0])])
# # 第2周开始
# for d in range(1,len(day)): # 0-21
# # print(d+1)
# L=L[int(day[d-1]):] # day[0]=2,
# L.append(L) # 将a安排到最后一个座位
# print(L[0:int(day[d])])# 列表是八个循环,我只要其中5个
# L2.append(L[0:int(day[d])])
# 以下是跳过假日的最初的写法,太长了,研究上面的是2022.9.9-2023.1.17 共21周的假日安排
print('---------第4步:xls写入)------')
workbook = xlwt.Workbook()# 新建xls工作簿
sheet = workbook.add_sheet("Sheet")# 新建xls工作簿的工作表的名字是sheet
# 第0列 写入“第1周、第2周、第3周……第21周
dates=[]
for i in range(1,int(weekweek+1)):
n="第{}周".format(i) # 用遍历方法获得“第1周、第2周、第21周”字样,
dates.append(n) # 添加到列表 s
print(dates)
# print(date)
row=1
for d in range(0, len(dates)):
sheet.write(row, 0, dates[d]) # 这里enumerate不能用,因为只有一列,所以就用
row += 1
# 第0行 写入 星期一 '星期二','星期三','星期四','星期五 #
weeks = ['周次','星期一','星期二','星期三','星期四','星期五']
week = len(weeks)
col=0
for d in range(0, len(weeks)):
sheet.write(0,col,weeks[d]) # 因为只有一行,所以就用有两种写法(enumerate和这种)
col+= 1
# 输入星期的另一种写法
# col=0
# for row,item in enumerate(weeks,0): # 可以这样写L2[i]=表格内的内容=item,索引数字=col 0代表在A1 1代表在B1
# sheet.write(col,row,item) # 第1行第1列开始写入一行”星期X"
# col+=1
# 第B2开始写入 活动室内容
arrlan = len(L2)# L2['07', '08', '01', '02', '03']的长度 21组
row = 1 # 第2行
for i in range(arrlan): # 遍历21组[]的总数
for col,item in enumerate(L2[i],1): # L2[i]=表格内的内容=item,索引数字=col
sheet.write(row,col,item) # row,col,item 行=1、列=索引数字、内容=表格内容 写入第一行第一列
row += 1
print('---------第5步:xls保存N份工作簿(每份一页)------')
try:
workbook.save(r"C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png\大{}班活动室安排.xls".format(gradenum[num])) # 新建保存 只能xls
print('计划生成成功')
except e:
print('失败...')
print(e)
print('---------第6步:把N份xls单页内容合并在1个工作簿的N个工作表内(班主任贴周计划用)------')
time.sleep(2)
# 获取目录下所有的表
import os
import pandas as pd
dir = r'C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png'
# 获取目录下所有的表
origin_file_list = os.listdir(dir)
print(origin_file_list)
with pd.ExcelWriter(r'C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png\20230217学期大班活动室(班主任用).xls') as writer:
# 循环遍历表格
for i in origin_file_list:
# 拼接每个文件的路径
file_path = dir + '/' + i
# 把表名赋予给对应的sheet
sheet_name = i[:-4]
df = pd.read_excel(file_path)
# 变相解决表格中第一行第一列为空的缺陷
ring = "".join(list(str(i) for i in df.index))
# string = .join(list(str(i) for i in df.index))
# 判断如果索引都为数字,则不保留索引(根据自己代码调整)
if ring.isdigit():
df.to_excel(writer, sheet_name,index=False)
else:
df.to_excel(writer, sheet_name)
# print('--------信息合并到1张上(所有的内容复制在一起,有标题(这里用不到)----------')
# #
# import os
# import pandas as pd
# # 功能:遍历目录下的所有xls文件,合并到指定的一个文件
# def main():
# #指定目录r
# base = r'C:\Users\jg2yXRZ\OneDrive\桌面\word2pdf2png'
# desktop = os.path.join(os.path.expanduser("~"), 'Desktop')
# #存放所有xls表的数据
# allLineData = pd.DataFrame()
# for excelFile in findAllFile(base):
# # 读取工作簿和工作簿中的工作表
# oneFileData =pd.read_excel(excelFile)
# # append忽略行头(忽略第一行)
# allLineData=allLineData.append(oneFileData, ignore_index=True)
# # print(allLineData)
# #写到桌面
# writer=pd.ExcelWriter(os.path.join(base,'202209大班游戏活动室 有标题合并版(班主任用).xls'))
# # 使用to_excel将之前读取的工作簿中工作表的数据写入到新建的工作簿的工作表中
# allLineData.to_excel(writer, index=False)
# # 保存并且关闭工作簿
# writer.save()
# #查找base目录下的所有xls和xlsx文件
# def findAllFile(base):
# for root, ds, fs in os.walk(base):
# for f in fs:
# if f.endswith('.xls') or f.endswith('.xlsx'):
# fullname = os.path.join(root, f)
# yield fullname
# if __name__ == '__main__':
# main()
感悟:
半年才做一次活动室排班表,优化代码的频率很低。在寒假期间,我也感觉自己完全没有动力去做编程研究。只有开始上班了,才会有各种各样需求和动机去写代码。