【教学类-07-01】20220122《破译电话号码-图形篇(图形固定列不重复)》(大班主题《我要上小学》)

背景缘起:

为了让Python与大班教学活动产生关联,我从主题教学书上找了两个项目《春天拼图》和《破译电话号码》,它们都包含了2个数加减法,理论上可以通过随机抽取列示题进行教具制作。

在大班《破译电话号码》的设计中,通过在CSDN上查找和修改代码。花了两个晚上,我终于把EXCEL里面的随机手机号码逐一生成了幼儿操作的“按图写数”的教具。(以下都是虚拟的手机号码)

问题产生

把随机11位电话号码分列后,我发现自己无法用代码把数字与符号一一对应,只能采用死办法:号码分列,然后手工批量Ctrl+D把数字改成对应的符号。为此,需要把数字1替换成一个●,而数字6就要变成●●●●●,这要花费一些时间,才能把22个数字注意转换,在短时间成功批量了28份教具。

   对于分列和批量替换太繁琐(查找替换方法,换一套电话号码就要重新做分列,数字9要复制9个符号,替换时容易输入错误的数量)的问题,我坚信Python一定有一个简单的方法转换这些数字和图形,只是我根本不知道如何去解决这个问题。

思路:

第一种《破译电话号码》:手机号码和拆分后的号码(图案)都在同一个EXCEL里。通过三个空格,让列表索引与单元格索引一直,使得每列图形保持一致,11个图形不重复。(第一列固定用●,第二列固定用△)

破解难题:

依旧感谢马先生用了一天时间就解决这个困扰我两个多月的问题,让我终于能够把大班《破译电话号码》的学具Python代码展示在CSDN平台上。

一、基本材料准备

1.三个文件放在同一个文件夹下,

2.  EXCEL的样式

(这些号码是随机生成的=RANDBETWEEN(13200000000-13900000000)

3.word模板的样式 

4.py 代码的内容

(3月28日改过 符号,这些符号都是黑色实心,,打印后不会出现黏连的情况,都是分离的符号个体,幼儿容易看清并数对)

""" 
@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运用到幼儿园办公工作和幼儿教学中,提高工作效率,推动幼儿个性化学习和层次性学习成效。   

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿夏reasonsummer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值