如何利用Python批量识别电子账单数据
这篇文章给大家分享的是有关如何利用Python批量识别电子账单数据的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。
一、前言
有一定数量类似如下截图所示的账单,利用 Python 批量识别电子账单数据,并将数据保存到Excel。
百度智能云接口打开https://cloud.baidu.com/,如未注册请先注册,然后登录点击管理控制台,点击左侧产品服务→人工智能→文字识别,点击创建应用,输入应用名称如Baidu_OCR,选择用途如学习办公,最后进行简单应用描述,即可点击立即创建。会出现应用列表,包括AppID、API Key、Secret Key等信息,这些稍后会用到。
二、调用Baidu aip识别
首先需要安装百度的接口,命令行输入如下:
pipinstallbaidu-aip-ihttp://pypi.douban.com/simple--trusted-hostpypi.douban.com
查看 Python 的 SDK 文档:
AipOcr是 OCR 的 Python SDK 客户端,为使用 OCR 的开发人员提供了一系列的交互方法。参考如下代码新建一个AipOcr:
fromaipimportAipOcr """你的APPIDAKSK""" APP_ID='你的AppID' API_KEY='你的ApiKey' SECRET_KEY='你的SecretKey' client=AipOcr(APP_ID,API_KEY,SECRET_KEY)
用户向服务请求识别某张图中的所有文字
"""读取图片""" defget_file_content(filePath): withopen(filePath,'rb')asfp: returnfp.read() image=get_file_content('example.jpg') """调用通用文字识别,图片参数为本地图片""" client.basicGeneral(image) """调用通用文字识别(高精度版)图片参数为本地图片""" client.basicAccurate(image)
识别出如下图片中的文字,示例如下:
fromaipimportAipOcr #"""改成你的百度云服务的IDAKSK""" APP_ID='18690701' API_KEY='QFaTVXvZdPrR05dNlR5I49xA' SECRET_KEY='*******************************' client=AipOcr(APP_ID,API_KEY,SECRET_KEY) defget_file_content(filePath): withopen(filePath,'rb')asfp: returnfp.read() image=get_file_content('example.jpg') #调用通用文字识别,图片参数为本地图片 result=client.basicGeneral(image) print(result) #提取识别结果 info='\n'.join([i['words']foriinresult['words_result']]) print(info)
结果如下:
三、批量识别电子账单
获取所有待识别的电子账单图像
frompathlibimportPath #换成你放图片的路径 p=Path(r'D:\test\test_img') #得到所有文件夹下.jpg图片 file=p.glob('**/*.jpg') forimg_fileinfile: print(type(img_file))#<class'pathlib.WindowsPath'>转成str img_file=str(img_file) print(img_file)
为了增加识别准确率,将账单上要提取的数据区域分割出来,再调用Baidu aip识别。
frompathlibimportPath importcv2ascv fromaipimportAipOcr fromtimeimportsleep APP_ID='18690701' API_KEY='QFaTVXvZdPrR05dNlR5I49xA' SECRET_KEY='**********************************' client=AipOcr(APP_ID,API_KEY,SECRET_KEY) """读取图片""" defget_file_content(filePath): withopen(filePath,'rb')asfp: returnfp.read() defidentity(num): result_list=[] foriinrange(num): image=get_file_content('img{}.jpg'.format(i)) """调用通用文字识别,图片参数为本地图片""" result=client.basicGeneral(image) print(result) sleep(2) #识别结果 info=''.join([i['words']foriinresult['words_result']]) result_list.append(info) print(result_list) src=cv.imread(r'D:\test\test_img\001.jpg') src=cv.resize(src,None,fx=0.5,fy=0.5) #print(src.shape) img=src[280:850,10:580]#截取图片高宽 money=img[70:130,150:450]#支出收入金额 goods=img[280:330,160:560]#商品 time_1=img[380:425,160:292]#支付时间年月日 time_2=img[380:425,160:390]#支付时间完整 way=img[430:475,160:560]#支付方式 num_1=img[480:520,160:560]#交易单号 num_2=img[525:570,160:560]#商户单号 img_list=[money,goods,time_1,time_2,way,num_1,num_2] forindex_,iteminenumerate(img_list): cv.imwrite(f'img{index_}.jpg',item) identity(len(img_list))
发现调用 client.basicGeneral(image),通用文字识别,-5.90识别成590,而图像里支付时间年月日 时分秒之间间隔小,识别出来都在一起了,需要把支付时间的年月日 时分秒分别分割出来识别,调用 client.basicAccurate(image),通用文字识别(高精度版)。
完整实现如下:
""" @File:test_01.py @Author:叶庭云 @CSDN:https://yetingyun.blog.csdn.net/ """ fromaipimportAipOcr frompathlibimportPath importcv2ascv fromtimeimportsleep importopenpyxl wb=openpyxl.Workbook() sheet=wb.active sheet.append(['消费','商品','支付时间','支付方式','交易单号','商品单号']) #"""改成你的百度云服务的IDAKSK""" APP_ID='18690701' API_KEY='QFaTVXvZdPrR05dNlR5I49xA' SECRET_KEY='*******************************' client=AipOcr(APP_ID,API_KEY,SECRET_KEY) """读取图片""" defget_file_content(filePath): withopen(filePath,'rb')asfp: returnfp.read() defidentity(num): result_list=[] foriinrange(num): image=get_file_content('img{}.jpg'.format(i)) """调用通用文字识别,图片参数为本地图片""" result=client.basicAccurate(image) print(result) sleep(1) #识别结果 info=''.join([i['words']foriinresult['words_result']]) result_list.append(info) result_list[2]=result_list[2]+''+result_list[3] result_list.pop(3) print(result_list) sheet.append(result_list) #换成你放图片的路径 p=Path(r'D:\test\test_img') #得到所有文件夹下.jpg图片 file=p.glob('**/*.jpg') forimg_fileinfile: img_file=str(img_file) src=cv.imread(r'{}'.format(img_file)) src=cv.resize(src,None,fx=0.5,fy=0.5) #print(src.shape) img=src[280:850,10:580]#截取图片高、宽范围 money=img[70:130,150:450]#支出金额 goods=img[280:330,160:560]#商品 time_1=img[380:425,160:292]#支付时间年月日 time_2=img[380:425,290:390]#支付时间时分秒 way=img[430:475,160:560]#支付方式 num_1=img[480:520,160:560]#交易单号 num_2=img[525:570,160:560]#商户单号 img_list=[money,goods,time_1,time_2,way,num_1,num_2] forindex_,iteminenumerate(img_list): cv.imwrite(f'img{index_}.jpg',item) identity(len(img_list)) #cv.imshow('img',img) #cv.imshow('goods',time_2) #cv.waitKey(0) wb.save(filename='识别账单结果.xlsx')
结果如下:
识别结果还不错,成功利用 Python 批量识别电子账单数据,并将数据保存到Excel。
感谢各位的阅读!关于“如何利用Python批量识别电子账单数据”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!
推荐阅读
-
Python中怎么动态声明变量赋值
这篇文章将为大家详细讲解有关Python中怎么动态声明变量赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
python中变量的存储原理是什么
-
Python中怎么引用传递变量赋值
这篇文章将为大家详细讲解有关Python中怎么引用传递变量赋值,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
python中怎么获取程序执行文件路径
python中怎么获取程序执行文件路径,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的...
-
Python中如何获取文件系统的使用率
Python中如何获取文件系统的使用率,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴...
-
Python中怎么获取文件的创建和修改时间
这篇文章将为大家详细讲解有关Python中怎么获取文件的创建和修改时间,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读...
-
python中怎么获取依赖包
今天就跟大家聊聊有关python中怎么获取依赖包,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据...
-
python怎么实现批量文件加密功能
-
python中怎么实现threading线程同步
小编给大家分享一下python中怎么实现threading线程同步,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!...
-
python下thread模块创建线程的方法
本篇内容介绍了“python下thread模块创建线程的方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来...