好友
阅读权限10
听众
最后登录1970-1-1
|
狂笑一君
发表于 2022-4-15 12:12
由于工作需求,我每天都需要把一堆填写的不怎么规范的地址通过地址册中查找出门牌号所属居委,找了个大佬写了个python程序,但是发现两个问题,一个是电脑系统,办公室现在的电脑基本是win7和win10,大佬在开发的时候用的平台是win10的python3.9,导致办公室的win7无法使用,我太菜了,不会改;第二个是,匹配的结果达不到理想状态,即使手动清洗了地址剩下了很容易分辨的地址后再使用程序进行匹配也不行,导致还是得人工去匹配。希望有大佬可以指教或者帮忙完善一下程序。
地址册是记录了所有归属居委的门牌地址,所需要的匹配的地址里面不一定全是在辖区范围内的门牌,也就是说有些地址不一定是我们辖区内的,最主要的问题是,有些人填些地址的时候不一定按照正常思路来填,我举个几个栗子:规范地址:广州市越秀区解放北路盘福横18号,不规范地址:越秀区解放北盘福横18号003,规范地址:广州市越秀区第一津街866号,不规范地址:越秀区第一津866号,规范地址:广州市越秀区司马坊街999号,不规范地址:越秀区西华路司马坊999号。
题外:现在每天都要收表然后拼表,数量繁多,大佬有没有什么经验方法可以分享一下?用过在线填报给他们多个部门填,但是,有些笨蛋部门会在填信息的时候把别人填写的资料删掉还自己不知道的所以放弃了。选择了稳健的人工收表拼表。目前手上的资源有个甲骨文的免费服务器。
以下是大佬写的python代码:
#!/usr/bin/python3
# -*- coding:utf-8 -*-
# __author__ = '__zx-coder__'
import re
from openpyxl import Workbook, load_workbook
import cpca
class Handler:
def __init__(self):
self.input_filename = './测试.xlsx' # 输入文件
self.book_filename = './地址册.xlsx' # 地址册
self.input_idx = 0
self.output_filename = './测试1.xlsx' # 输出文件
self.wb = Workbook()
self.ws_writer = self.wb.active
def reader(self, path):
wb = load_workbook(path)
ws = wb.active
rows = ws.rows
return [[col.value for col in row] for row in rows]
def start(self):
if input('请确认输入文件是:测试.xlsx文件吗?Y:确认;任意键:否认,重新更名. :') == 'Y':
input_col = input('请输入该文件所在地址信息列,例:A,B:')
uppercase_list = [chr(i) for i in range(ord('A'), ord('Z') + 1)]
self.input_idx = uppercase_list.index(input_col) if input_col in uppercase_list else 0
def handle_input_file(self):
addrList = self.reader(self.input_filename)
addListT = list(map(list, zip(*addrList)))
df = cpca.transform(addListT[0])
# 越秀区判断
iloc_2 = df.iloc[:, [2]]
_addr_list = [item[0] for item in iloc_2.values.tolist()]
iloc_3 = df.iloc[:, [3]]
_addr_list_3 = [item[0] for item in iloc_3.values.tolist()]
# 清洗越秀
clear_list = []
for idx, qu in enumerate(_addr_list):
if qu and qu == '越秀区':
clear_list.append(_addr_list_3[idx])
else:
clear_list.append('')
# print(clear_list)
# 号
clear_list = [search.group() if (search := re.search('.*?号', x)) else x for x in clear_list]
for idx, item in enumerate(addrList):
item.append(clear_list[idx])
# 结构:···原来的数据, 拆分后的地址
return addrList
def handle_book_file(self):
book = self.reader(self.book_filename)
bookT = list(map(list, zip(*book)))
return bookT
def main(self):
self.start()
addrList = self.handle_input_file()
#写入第一行
first_line = addrList[0]
self.ws_writer.append(first_line)
addrList = self.handle_input_file()[1:]
book_list, COM_LIST = self.handle_book_file()
book_list = book_list[1:]
COM_LIST = COM_LIST[1:]
for pure_idx, item in enumerate(addrList):
print(f'正匹配 ··· {item[self.input_idx]}')
pure_addr = item[-1]
for book_idx, book in enumerate(book_list):
if book.strip() == pure_addr.strip():
item[-1] = COM_LIST[1:][book_idx]
break
if '居委会' not in item[-1]:
item[-1] = ''
self.ws_writer.append(item)
self.wb.save(self.output_filename)
print('执行结束!')
if __name__ == '__main__':
handler = Handler()
# print(handler.reader())
handler.main()
下面是地址册和地址。
「text.xlsx」https://www.aliyundrive.com/s/Cxug1o2EXu5 提取码: z50d
点击链接保存,或者复制本段内容,打开「阿里云盘」APP ,无需下载极速在线查看,视频原画倍速播放。
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|