为了让Python与大班教学活动产生关联,我从主题教学书上找了两个项目《春天拼图》和《破译电话号码》,它们都包含了2个数加减法,理论上可以通过随机抽取列示题进行教具制作。
在大班《破译电话号码》的设计中,通过在CSDN上查找和修改代码。花了两个晚上,我终于把EXCEL里面的随机手机号码逐一生成了幼儿操作的“按图写数”的教具。(以下都是虚拟的手机号码)
把随机11位电话号码分列后,我发现自己无法用代码把数字与符号一一对应,只能采用死办法:号码分列,然后手工批量Ctrl+D把数字改成对应的符号。为此,需要把数字1替换成一个●,而数字6就要变成●●●●●,这要花费一些时间,才能把22个数字注意转换,在短时间成功批量了28份教具。
对于分列和批量替换太繁琐(查找替换方法,换一套电话号码就要重新做分列,数字9要复制9个符号,替换时容易输入错误的数量)的问题,我坚信Python一定有一个简单的方法转换这些数字和图形,只是我根本不知道如何去解决这个问题。
第一种《破译电话号码》:手机号码和拆分后的号码(图案)都在同一个EXCEL里。通过三个空格,让列表索引与单元格索引一直,使得每列图形保持一致,11个图形不重复。(第一列固定用●,第二列固定用△)
依旧感谢马先生用了一天时间就解决这个困扰我两个多月的问题,让我终于能够把大班《破译电话号码》的学具Python代码展示在CSDN平台上。
"""
@author: 马先生
@file: 马先生 手机号码数字批量变图形.py
@time: 2022/1/25 14:22
"""
# 第一部分:把EXCEL表格里面的手机号码数字批量变图形。
import openpyxl
import random
wb = openpyxl.load_workbook(r'D:\test\04破译电话号码\02合计\02phoneNumber.xlsx')# wb=用openpyxl打开存有号码的ExcelEx
phone = wb.active #phone=获取wb里面的数据
# 第一套电话号码:dad的手机号码 数字变成不同的图形
symbol = ['','','','▲','▼','●','♦','■','▶','◀','◣','◥','◤','◢']# Excel前三列是空的 列索引 0123 3=●,前面三个空格,符号可以用搜狗输入法的“符号来插入
for i in list(phone.columns)[1]:# 循环遍历 phone的列 phone就是打开的电话簿可迭代对象, 并选表格里的的第二列 0123数下去(电话号码列)
# 然后用列columns去选择(选表格里的的第二列B列) ,也可以去选择行row
phonestr = str(i.value)# 电话字符串 = 第二列的数字的值的字符串形式
print(phonestr)# 电打印电话字符串
col = 3 # 列=3 第一个字符串的起始列 123数下去 3等于C列(第一列序号 第二列电话号码 所以填字符串从第三列开始填)
for _ in phonestr[:]:# 在电话字符串里面循环遍历 取各种数字
if i.value != 'dad':# 如果电话号码的值不等于'dad' 不要第一行C1
if int(_) != 0:# 如果取出的数字不等于0 等于1-9
str_temp = int(_) * symbol[col] # 结果等于 取出的数字的整数 乘以 符号列表的相应列数的符号(批量几个符号)
else:# 如果取出的数字=于0
str_temp = '0'# 0=零
phone.cell(row = i.row ,column = col).value = str_temp # 电话表的信息(行等于i,i=第二列的11位电话号码
# 列等于C1第三列)的值 等于结果(整数乘以对应符号生成相应数量)
col += 1 #col = col +1 从第三列开始不断增加
# 第2套电话号码:mum的手机号码 数字变成同样的图形
symbol = ['', '','','', '','','', '','', '','', '','', '','','●','●','●', '●', '●', '●','●', '●','●','●','●']# # Excel前15列是空的 列索引 0123 15=●,前面三个空格,
for j in list(phone.columns)[13]:# 循环遍历 phone的列 phone就是打开的电话簿可迭代对象, 并选表格里的的第13列 012345数下去(电话号码列)
# 然后用列columns去选择(选表格里的的第二列) ,也可以去选择行row
phonestr = str(j.value)
print(phonestr)
col = 15# 第一个字符串的起始列 123数下去 mum电话的第一位数在第O列=15列
for _ in phonestr[:]:
if j.value != 'mum':
if int(_) != 0:
str_temp = int(_) * symbol[col]
else:
str_temp = '0'
phone.cell(row = j.row ,column = col).value = str_temp
col += 1
wb.save(r'D:\test\04破译电话号码\02合计\02phoneNumber.xlsx')
print('保存完毕...')
'''
print(i.row )
print(i.column)
print(i.value)
print(j.row )
print(j.column)
print(j.value)
'''
#for i in range(2, phone_count):
# print(phone.cell(row = i, column = 2).value)
# 第二部分:把EXCEL表格里面的数字图形逐一填入word模板内,生成大班幼儿人手一份学具(作业题)
from docxtpl import DocxTemplate
import pandas as pd
import os
zpath=os.getcwd()+'\\'
zpath=r'D:\test\04破译电话号码\02合计'+'\\'
file_path=zpath+r'\电话号码单'
# 二、遍历excel,逐个生成word(form.docx是前面的模板)
try:
os.mkdir(file_path)
except:
pass
tpl = DocxTemplate(zpath+'04phonedoc.docx')
# 打开doc模板
phonedoc = pd.read_excel(zpath+'02phoneNumber.xlsx')
# 压缩的EXCEL文档
N=phonedoc["N"] #N是学号
b1 = phonedoc["b1"]#根据word模板上的提示,把Excel的列字母与word列字母一一对应
b2 = phonedoc["b2"]
b3 = phonedoc["b3"]
b4 = phonedoc["b4"]
b5 = phonedoc["b5"]
b6 = phonedoc["b6"]
b7 = phonedoc["b7"]
b8 = phonedoc["b8"]
b9 = phonedoc["b9"]
b10 = phonedoc["b10"]
b11 = phonedoc["b11"]#b1-b11是爸爸的手机号码 word第一行
c1 = phonedoc["c1"]
c2 = phonedoc["c2"]
c3 = phonedoc["c3"]
c4 = phonedoc["c4"]
c5 = phonedoc["c5"]
c6 = phonedoc["c6"]
c7 = phonedoc["c7"]
c8 = phonedoc["c8"]
c9 = phonedoc["c9"]
c10 = phonedoc["c10"]
c11 = phonedoc["c11"]#c1-c11是妈妈的手机号码 word第二行
# str.rstrip()用于去掉换行符
# 遍历excel行,逐个生成
num = phonedoc.shape[0]
for i in range(num):
context = {
"N": N[i],#N是学号
"b1": b1[i],#b1-b11是爸爸的手机号码 word第一行
"b2": b2[i],
"b3": b3[i],
"b4": b4[i],
"b5": b5[i],
"b6": b6[i],
"b7": b7[i],
"b8": b8[i],
"b9": b9[i],
"b10": b10[i],
"b11": b11[i],
"c1": c1[i],#c1-c11是妈妈的手机号码 word第二行
"c2": c2[i],
"c3": c3[i],
"c4": c4[i],
"c5": c5[i],
"c6": c6[i],
"c7": c7[i],
"c8": c8[i],
"c9": c9[i],
"c10": c10[i],
"c11": c11[i],
# "eng": eng[i] 原作者模板上的内容
}
tpl = DocxTemplate(zpath+'04phonedoc.docx')#使用已有的模板
tpl.render(context)
tpl.save(file_path+r"\{} 的电话号码.docx".format(N[i]))#保存为XX学号的电话号码word
# 三、把word所在文件夹打包压缩,便于发送。
import zipfile
# 设定压缩后的压缩包地址和名称
zipName = zpath + '破译电话号码.zip'
z = zipfile.ZipFile(zipName,'w',zipfile.ZIP_DEFLATED)
for dirpath,dirnames,filenames in os.walk(file_path):
for filename in filenames:
print(filename)
z.write(os.path.join(dirpath, filename),filename)
z.close()# 要记得close
# 附解压:
#将打包的文件解压
f = zipfile.ZipFile(zipName, 'r')
for file in f.namelist():
f.extract(file)
万分感谢马先生的代码,让大班的点数配对作业《破译电话号码》的程序变得简便易操作。我也学到了单元格索引和列索引的原理。只有在实际需求中进行学习,才能更直观地理解Python代码的含义(马先生指导下我把注释写的满满的 哈哈 )
这是阿夏第8个实际运用到幼儿园教学中的Python自动化案例(教学类-07),希望能通过借鉴、实验、修改,将Python运用到幼儿园办公工作和幼儿教学中,提高工作效率,推动幼儿个性化学习和层次性学习成效。