100行Python代码,上人民日报了!
大家好,我是小五。
说一个前几天的事,【核酸报告核查太繁琐?这位复旦人写了130行代码搞定】这个新闻估计不少同学都看到了,后来又被人民日报转发,当做抗疫中的创新小事迹宣传。
简而言之,复旦大学需要开展全员核酸检测,而班级辅导员都要收集学生的“健康云”截图,并挨着查看是否参加核酸。这位复旦同学通过Python编程,利用OCR+正则表达式提取截图中的关键字导出结果到Excel中,解决了这个麻烦的手动问题。
我自己非常乐意看到Python出圈,也特别开心看到Python能够解决生活工作中的问题。这本来是个典型的Python自动化办公案例,结果分别上了微博、知乎后引发了大量的讨论。很多评论/回答表示“这也能吹?没有新闻可以不发”。
我看了复旦的原文,其中媒体对技术实现描述的段落确实有点尬,不过这位博士同学能够发现痛点、解决痛点真的很赞!
作为Python爱好者,我第一时间还是想着复刻一遍这位复旦博士Python代码,后面再聊聊我的看法。原文中所说的程序思路为ocr文字识别+正则表达式筛选,再结合大家截图估计大小不统一(无法ocr特定位置的文字)的情况,那大概思路就get了。
Python思路:ocr提取全部文字,并全部拼接为字符串,再正则表达式提取关键词,最后导出到Excel中。
常用的Python中文ocr方法,要么使用PaddleOCR库要么干脆直接使用百度的api接口。PaddleOCR是一个超棒的OCR工具库,之前我们还用它写了一个图像文字识别OCR程序,但是大家安装时往往会遇到各种坑,所以并不是很建议。百度api呢,之前我也曾经分享过OCR识别快递单的案例,所以可以直接使用。
在交互式环境中输入如下命令:
def get_words_result(filePath):
image = open(filePath, 'rb')
text_list = client.general(image.read())
texts = ""
for i in range(25):
texts += text_list['words_result'][i]['words']
image.close()
return texts
get_words_result("D:/下载/健康云/张三.jpg")
输出:
'04:491l5G2结果查询本查询服务由上海市卫生健康委员会提供姓名张三证件类型身份证证件号码3101******2495样本编码3303806213采样时间2022-04-0211:36:32检测机构上海市徐汇区疾病预防控制中心检测时间2022-04-03检测项目核酸检测结果待复核姓名证件类型身份证'
如下图所示,由于我们只需要其中的“姓名”、“采样时间”、“检测结果”等,那么便使用正则表达式从上述代码输出结果中提取关键文本。
在交互式环境中输入如下命令:
import re
re.findall(r'姓名(.*?)证件类型', data_ll)[0]
输出:
'张三'
同理可以得到其他几项待提取文本信息。至于如何批量识别图片,使用os.listdir()
+for循环即可,具体可以参考我近期分享过的《Python识别花卉种类,并自动整理分类!》。如果想将最后执行结果导出到Excel中,可以直接Pandas导出,若想保持一定表格格式则可以选用openpyxl模块。
由于篇幅大小,我就不一一展示Python代码了,如果对完整代码感兴趣或者个人对OCR识别核酸报告/健康码截图有需求,可以添加小五微信(zpw505)获取。
1、我个人是非常喜欢使用Python解决生活工作中的问题,之前特别写了一个专栏【Python改变生活】。但是,如果将Python小程序应用到工作中一定要慎重再慎重,即便有万分之一的概率,也不要直接使用。至少可以写个复核程序,人工再检查一遍(个人亲身经历)。
2、那么回到前文,复旦博士写程序自动核查核酸报告肯定是一件解放生产力的好事,但绝对不是最优解。我们一方面要鼓励赞赏这种行为,一方面也要思考有没有更好的解决办法。
打个最坏的比方,如果有人对截图进行P图,这个程序会被直接绕过的。哪里的数据是最准确的?后台数据库啊。
3、新冠疫情已经是第三个年头了,按理说各省市的健康码、核酸检测系统应该是分享完善的。既然各级政府/事业单位有统计人员核酸结果的需求,那么从统一的核酸数据库开放API接口才是真正应该做的事情。信息化时代,不能而等着大家发挥主观能动性,靠人力去执行这些简单的任务。
4、在过去的疫情新闻中,前有日本厚生劳动省人工核对数据,后有英国漏报将近16000个新冠病例,因Excel超出最大值未更新。我们在当做笑话看的时候,转眼一看自家的信息化转型也是任重道远啊。