每年要跟邮局订购一批期刊,由于大部分期刊的价格每年都会有小幅度的上涨,每年在比对价格的时候弄的头昏眼花,既然咱入了Python的坑,那何不让Python来帮忙做这些事呢。开始尝试吧!
大致思路:
(1)通过文字识别录入最新的期刊名和价格,保存在csv文件中。
(2)通过比对往年的期刊名,匹配成功的,更新最新的期刊价格,匹配失败的,输出具体期刊名,提示“未找到该期刊”。
下面开始具体操作:
(1)文字识别录入数据
首先,我用手机把纸质报刊订阅清单一张张拍照,然后拷到电脑里。在这里,拍照有个技巧,可以用一张白纸盖住,然后把需要识别信息的地方挖个洞,这样就可以事先过滤掉大部分的无用信息,为后面写代码提供了遍历。如图:
![](https://img.haomeiwen.com/i14855820/5edd63366d2b5ed9.png)
图片拷到电脑后,给图片重新命名为'1.jpg'、‘2.jpg’...,这样做也是为了方便后面写代码。如果图片很多可以用图片重命名软件批量重命名。
重命名好图片后就要考虑开始文字识别了,我采用的是百度的文字识别API,网址:http://ai.baidu.com/tech/ocr。为什么用它?因为简单易用,识别准确。
建一个文件getOcrData.py,将识别的数据保存在csv文件中。具体代码如下:
from aip import AipOcr
import re,csv
import openpyxl
APP_ID = '14830***'
API_KEY = 'zZwpvc6H5z9qGic8g5AK****'
SECRET_KEY = 'FsWu8msV8U8zIpEHXACuZWC5GT1*****'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY) #连接baidu文字识别API
f = open('qikan.csv','wt',newline='',encoding='UTF-8')
writer = csv.writer(f)
pic_urls = ['pic/{}.jpg'.format(str(i)) for i in range(1,31)] #构造待识别图片url列表
title = []
price = []
for pic_url in pic_urls:
item = open(pic_url, 'rb') #以二进制读取图片
img = item.read()
message = client.basicGeneral(img)
for i in message.get('words_result'):
word = i.get('words')
if word[-1].isdigit(): #判断是否是价格,这里偷懒判断最后1位是否为数字来判定
price.append(word)
else:
title.append(word)
data = dict(zip(title,price)) #将识别的数据以题名为键,以价格为值保存在字典中
print('共识别{}条数据\n'.format(len(data)))
for title, price in data.items():
writer.writerow((title,price))
f.close()
保存文件,运行,得到如下图结果:
![](https://img.haomeiwen.com/i14855820/60175abf7db25bb9.png)
(2)首次尝试更新期刊价格
有了期刊的价格后,下面就要更新期刊价格了,为什么说是首次尝试呢?因为百度文字识别虽说准确率较高,但也达不到100%,总归有点小问题,第一次尝试更新期刊价格的目的就是要找到哪些地方还存在问题,然后去手动修改一下。新建updatePrice.py,更新期刊价格的代码如下:
import re,csv
import openpyxl
wb = openpyxl.load_workbook('test.xlsx') #加载excel工作簿
sheet = wb.active #激活主工作表
data = {}
csv_file = csv.reader(open('qikan.csv', 'r'))
for li in csv_file:
data[li[0]] = li[1] #读取csv,并将数据转为字典格式
for row_num in range(117, sheet.max_row): #遍历excel
name = sheet.cell(row=row_num, column=4).value
try:
if name in data:
sheet.cell(row=row_num,column=7).value = data[name] #更新数据
print('已更新 ' + name)
else:
print('未找到 '+ name)
except TypeError:
pass
wb.save('test.xlsx')
代码很简单,写好后保存,运行,发现有不少未找到的期刊,手工打开excel文件和csv文件,找出未找到的期刊名,如果是识别有问题,则手动改回正确的,全部改好后,保存文件,再次运行一遍updatePrice.py,搞定!
![](https://img.haomeiwen.com/i14855820/c29e94241064cbfd.png)
网友评论