【办公类110-07】20260807园园通-“中班大班“户籍地址和居住地址补充完整(Python+EXCEL)

Excel的公式

去掉闵行区的“街道居委会”(区和)之间删除)

=IFERROR(LEFT(AB2,FIND("区",AB2)) & MID(AB2,FIND(")",AB2, FIND("区",AB2))+1,999),AB2)

去掉上海闵行的“区 弄”重复的

=IFERROR(LEFT(AD2,FIND("区",AD2))&MID(MID(AD2,FIND("区",AD2)+1,999),FIND("弄",MID(AD2,FIND("区",AD2)+1,999))+1,999),AD2)

一、背景需求

过去几年,我下载园园通的幼儿信息、地址、发现地址总是特别长——包含了上海市(省)、上海市(市)、闵行区(区)、街道(XXX街道)、居委(XXX居委会(X一居委))、路、弄、号、名。

之前用Python提取正则,去除重复的文字

【办公类-112-03】20250904儿童基本情况登记+户籍+去重居委会+正则去重重复字段(运用https://mp.csdn.net/mp_blog/creation/editor/151194187

以上用Python去重,但是只是在下载的Excel里面制作,没有重新改变园园通里的地址格式。三

二、手工去除长地址

本次我想从园园通下载中班的户籍地址和居住地址,然后在Excel里用公式或手动删除方式把所有地址变成规范地址“省市区路弄号”,(去重、补全省市区)

(一)园园通,中班幼儿信息下载

多年来,中大班园园通的幼儿地址,最大的问题就的“居住地址”太长了,因为它把左侧的“省市区街道居委”+路弄号室都包含了。导出后

(二)数据处理

1.现居地址

筛选排序(降序)——都是超长地址

所以我们要批量去掉所有的居委会,去掉两个“上海市”

去掉街道

 没有闵行区

人工补“室”

补了12个室,发现一个没写全地址的

把区和)之间的的内容删除

#这是EXCEL
=IFERROR(LEFT(AH2,FIND("区",AH)) & MID(A1,FIND(")",AH2, FIND("区",AH2))+1,999),AH2)

发现“路和弄”出现了两次,需要删除一次

我还是用第一种

#EXCEL
=LEFT(A1,FIND("区",A1))&MID(MID(A1,FIND("区",A1)+1,999),FIND("弄",MID(A1,FIND("区",A1)+1,999))+1,999)

把A1替换成AH2(从第2行开始)

人工筛选参照原始地址,筛选,添补,缩减。把所有地址弄得差不多长(本园附近的地址都是差不多结构“上海市闵行区XX路XX弄XX号X室)

2.修改户籍地址(大量外省市的)

先用刚才的方法处理上海市闵行区的内容

先复制一份到右侧,以免搞错了数据

居右排列,补“室"

删除两个“上海市”

删除街道

删除“区”和“)”之间的数据(这个括号要复制里面的括号,有大小写不同)

=IFERROR(LEFT(A1,FIND("区",A1)) & MID(A1,FIND(")",A1, FIND("区",A1))+1,999),A1)

=IFERROR(LEFT(AB8,FIND("区",AB8)) & MID(AB8,FIND(")",AB8, FIND("区",AB8))+1,999),AB8)

只有上海闵行的地区里面的(街道(居委))被去掉了

去掉上海里面的重复的内容,但是要手动添补

=LEFT(AC2,FIND("区",AC2))&MID(MID(AC2,FIND("区",AC2)+1,999),FIND("弄",MID(AC2,FIND("区",AC2)+1,999))+1,999)

只有部分上海市闵行区的

上海所有区的地址都手动修改了

外省市地址是 省市重复

我问豆包要了集中代码,但是都没有删除“省市区县”的重复,最后还是手动

说不清楚,有些是重复的,有些就是正好,

发现一组规律:前面三个正好是之前按钮选择“”,后面两个是家长填写的户口地址“只有”,不包含“”(可能户口本上的地址就是这样写的)

有的家长户口本上包含了省市区,所以就写全了

手动删减后

把短地址放到AA列,文本'值”黏贴

一共142,预设每次35人,分4次

由此,中班幼儿的户籍地址和居住地址都改成标准地址了

三、代码运行

用新地址(短地址)替换园园通里的(长地址)

火狐浏览器100%


'''
园园通中班孩子 两个地址补全(省市区)再次写入园园通。
火狐浏览器,必须100%
为防止园园通变慢,30-40人一组。完成后关闭园园通,再次开启
豆包,阿夏
20260819
'''


import openpyxl
import pyautogui
import time
import pyperclip
import pygetwindow as gw

# 1. 找到VSCode窗口(匹配标题含 Visual Studio Code)
vscode_wins = gw.getWindowsWithTitle("Visual Studio Code")
if not vscode_wins:
    print("未找到VSCode窗口,请先打开VSCode再运行!")
else:
    win = vscode_wins[0]
    # 自动最小化VSCode
    win.minimize()
    print("VSCode已自动最小化,你有5秒时间移动鼠标到目标位置")
    time.sleep(5)  # 等待5秒给你放鼠标

import random

# 随机休眠:1~3秒,带小数,模拟真人操作
def rand_sleep():
    t = random.uniform(2, 3)
    time.sleep(t)


file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260819中班幼儿地址补全.xlsx"

wb = openpyxl.load_workbook(file_path)


# 读取表格
for sheet_name in wb.sheetnames:
    ws = wb[sheet_name]
    # for row in ws.iter_rows(min_row=51, values_only=True):        # 从第二行开始读取姓名
    # for row in ws.iter_rows(min_row=2, max_row=36, values_only=True):        # 做测试第一组人员,防止园园通卡通。 36=杨
    # for row in ws.iter_rows(min_row=36, max_row=67, values_only=True):        # 做测试第2组人员,防止园园通卡通。36还是杨, 67=汪 要从68开始+35 68刘
    # for row in ws.iter_rows(min_row=68, max_row=103, values_only=True):    # 第3组
    # for row in ws.iter_rows(min_row=104, max_row=141, values_only=True):   #第4组
    for row in ws.iter_rows(min_row=142, max_row=142, values_only=True):   #第4组
    # for row in ws.iter_rows(min_row=21, values_only=True):    # 如果出问题,断了,从第X行读取孩子姓名
        name = row[2]         # 姓名3
        Registered_Address = row[26]    # 户口地址27
        Residential_Address = row[34]    # 居住地址35        
        # print(name,Residential_Address)
      


         # 点击姓名栏,
        pyautogui.click(861,376)
        # 1. 复制指定文字到剪贴板
        # print('写入姓名:',name)
        pyperclip.copy(name)
        # 2. 模拟Ctrl+V粘贴
        pyautogui.hotkey("ctrl", "v")
        rand_sleep()  # 延迟2秒切换窗口

         # 搜索
        pyautogui.click(758,497)        
        rand_sleep()

         # 编辑
        pyautogui.click(1652,671)    
        time.sleep(3)

        # 模拟滚动到底部
        pyautogui.click(1652,671)  
        for _ in range(2):
            pyautogui.scroll(-1000)
        rand_sleep()
            # time.sleep(0.3)  # 每滚轮一下间隔0.3秒

       # 户籍地址点击三次
        for i in range(3):
            pyautogui.click(1404,473)
        rand_sleep()
        # 1. 复制指定文字到剪贴板
        # print('写入姓名:',name)
        pyperclip.copy(Registered_Address)
        # 2. 模拟Ctrl+V粘贴
        pyautogui.hotkey("ctrl", "v")
        rand_sleep()  # 延迟2秒切换窗口


        # 居住地址点击三次
        for i in range(3):
            pyautogui.click(1173,771)
        rand_sleep()
        # 1. 复制指定文字到剪贴板
        # print('写入姓名:',name)
        pyperclip.copy(Residential_Address)
        # 2. 模拟Ctrl+V粘贴
        pyautogui.hotkey("ctrl", "v")
        rand_sleep()  # 延迟2秒切换窗口

        # 下移到底部
        for _ in range(1):
            pyautogui.scroll(-1000)
        rand_sleep()


        # 确认,回到最初的界面
        pyautogui.click(1027,857)
        time.sleep(6)    # 保存时间长一点

# 自动最大化VSCode
win.maximize()
print("VSCode已自动最大化,程序结束")


园园通运行时间久了,就会卡顿,所以我把142人拆分成4组,每组35人左右,运行了五次

每一次35人运行大约平均18分钟。

运行过程中拍的照片

四、验证成果

(一)再次下载园园通中班幼儿数据

(二)地址列,做升序检查

户口地址升序-格式非常统一

还是有“漏网之鱼”,数量较少,在园园通里人工修改

中班就完工了。

五、制作大班双地址优化

同理制作大班,也是超长地址

(一)下载园园通 大班幼儿的所有数据

(二)隐藏不需要的列,保留姓名,户籍地址、现居地址,也是超长地址

(三)修改现居地址

=IFERROR(LEFT(A1,FIND("区",A1)) & MID(A1,FIND(")",A1, FIND("区",A1))+1,999),A1)

同样方式做户籍地址,先升序。

右侧插入空列

=IFERROR(LEFT(AA2,FIND("区",AA2)) & MID(AA2,FIND(")",AA2, FIND("区",AA2))+1,999),AA2)

只有地址变成“值”,才能进行内容替换,才能被其他单元格援引数据。

去掉居委会居右,补“室”

右侧插入空列

=IFERROR(LEFT(AB2,FIND("区",AB2))&MID(MID(AB2,FIND("区",AB2)+1,999),FIND("弄",MID(AB2,FIND("区",AB2)+1,999))+1,999),AB2)

上海其他区域地址,人工批量

把整列贴成“值”

上海的其他区县的*街道 居委(都是其他)”要手动删除

外省户籍,也是两款,

(四)户籍地址修改

外省地址需要手动修改。如果识别出原理,应该也能用公式制作,现在还做不出来。

(五)大班双地址(短地址)也要在园园通内修改掉

一共157人,按40人一组,分4次生成


'''
园园通中班孩子 两个地址补全(省市区)再次写入园园通。
火狐浏览器,必须100%
为防止园园通变慢,30-40人一组。完成后关闭园园通,再次开启
豆包,阿夏
20260819
'''


import openpyxl
import pyautogui
import time
import pyperclip
import pygetwindow as gw

# 1. 找到VSCode窗口(匹配标题含 Visual Studio Code)
vscode_wins = gw.getWindowsWithTitle("Visual Studio Code")
if not vscode_wins:
    print("未找到VSCode窗口,请先打开VSCode再运行!")
else:
    win = vscode_wins[0]
    # 自动最小化VSCode
    win.minimize()
    print("VSCode已自动最小化,你有5秒时间移动鼠标到目标位置")
    time.sleep(5)  # 等待5秒给你放鼠标

import random

# 随机休眠:1~3秒,带小数,模拟真人操作
def rand_sleep():
    t = random.uniform(2, 3)
    time.sleep(t)


file_path = r"C:\Users\mhjg2\Desktop\20260805园园通小班分班\20260819大班幼儿地址补全.xlsx"

wb = openpyxl.load_workbook(file_path)


# 读取表格
for sheet_name in wb.sheetnames:
    ws = wb[sheet_name]
    # for row in ws.iter_rows(min_row=51, values_only=True):        # 从第二行开始读取姓名
    for row in ws.iter_rows(min_row=2, max_row=42, values_only=True):        # 做测试第一组人员,防止园园通卡通。 36=杨
    # for row in ws.iter_rows(min_row=43, max_row=83, values_only=True):        # 做测试第2组人员,防止园园通卡通。36还是杨, 67=汪 要从68开始+35 68刘
    # for row in ws.iter_rows(min_row=84, max_row=124, values_only=True):    # 第3组
    # for row in ws.iter_rows(min_row=125, max_row=159, values_only=True):   #第4组
    
    # for row in ws.iter_rows(min_row=21, values_only=True):    # 如果出问题,断了,从第X行读取孩子姓名
        name = row[2]         # 姓名3
        Registered_Address = row[26]    # 户口地址27
        Residential_Address = row[33]    # 居住地址34       
        print(name,Residential_Address)
      


#          # 点击姓名栏,
#         pyautogui.click(861,376)
#         # 1. 复制指定文字到剪贴板
#         # print('写入姓名:',name)
#         pyperclip.copy(name)
#         # 2. 模拟Ctrl+V粘贴
#         pyautogui.hotkey("ctrl", "v")
#         rand_sleep()  # 延迟2秒切换窗口

#          # 搜索
#         pyautogui.click(758,497)        
#         rand_sleep()

#          # 编辑
#         pyautogui.click(1652,671)    
#         time.sleep(3)

#         # 模拟滚动到底部
#         pyautogui.click(1652,671)  
#         for _ in range(2):
#             pyautogui.scroll(-1000)
#         rand_sleep()
#             # time.sleep(0.3)  # 每滚轮一下间隔0.3秒

#        # 户籍地址点击三次
#         for i in range(3):
#             pyautogui.click(1404,473)
#         rand_sleep()
#         # 1. 复制指定文字到剪贴板
#         # print('写入姓名:',name)
#         pyperclip.copy(Registered_Address)
#         # 2. 模拟Ctrl+V粘贴
#         pyautogui.hotkey("ctrl", "v")
#         rand_sleep()  # 延迟2秒切换窗口


#         # 居住地址点击三次
#         for i in range(3):
#             pyautogui.click(1173,771)
#         rand_sleep()
#         # 1. 复制指定文字到剪贴板
#         # print('写入姓名:',name)
#         pyperclip.copy(Residential_Address)
#         # 2. 模拟Ctrl+V粘贴
#         pyautogui.hotkey("ctrl", "v")
#         rand_sleep()  # 延迟2秒切换窗口

#         # 下移到底部
#         for _ in range(1):
#             pyautogui.scroll(-1000)
#         rand_sleep()


#         # 确认,回到最初的界面
#         pyautogui.click(1027,857)
#         time.sleep(6)    # 保存时间长一点

# # 自动最大化VSCode
# win.maximize()
# print("VSCode已自动最大化,程序结束")


(六)验证有没有遗漏

因为没法单独把中班和大班一起挑出来,所以我下载全部孩子的地址

先查看居住地,地址长度统一

这个地址补全,应该是XXX路210弄(不是小区名称)

再看户籍地址,有缺失

少一个市

筛选一遍以后再园园通里修改,

(七)第二次下载全园幼儿数据

然后再次下载全园的rar进行筛查。总会发现一些问题

三个孩子一个户籍,原来是公共户口

其他户籍地址没有问题。

五、感悟:

如果再下载,说不定也会发现细枝末节的小问题。所以数据的精准考人力检查,是很难做到的。但是现阶段可以借助一部分Python处理,但更多还是要人力检验。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿夏reasonsummer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值