每年要跟郵局訂購(gòu)一批期刊,由于大部分期刊的價(jià)格每年都會(huì)有小幅度的上漲,每年在比對(duì)價(jià)格的時(shí)候弄的頭昏眼花,既然咱入了Python的坑看锉,那何不讓Python來(lái)幫忙做這些事呢。開(kāi)始嘗試吧塔鳍!
大致思路:
(1)通過(guò)文字識(shí)別錄入最新的期刊名和價(jià)格伯铣,保存在csv文件中。
(2)通過(guò)比對(duì)往年的期刊名轮纫,匹配成功的腔寡,更新最新的期刊價(jià)格,匹配失敗的掌唾,輸出具體期刊名放前,提示“未找到該期刊”。
下面開(kāi)始具體操作:
(1)文字識(shí)別錄入數(shù)據(jù)
首先糯彬,我用手機(jī)把紙質(zhì)報(bào)刊訂閱清單一張張拍照凭语,然后拷到電腦里。在這里情连,拍照有個(gè)技巧叽粹,可以用一張白紙蓋住览效,然后把需要識(shí)別信息的地方挖個(gè)洞却舀,這樣就可以事先過(guò)濾掉大部分的無(wú)用信息,為后面寫(xiě)代碼提供了遍歷锤灿。如圖:
圖片拷到電腦后挽拔,給圖片重新命名為'1.jpg'、‘2.jpg’...但校,這樣做也是為了方便后面寫(xiě)代碼螃诅。如果圖片很多可以用圖片重命名軟件批量重命名。
重命名好圖片后就要考慮開(kāi)始文字識(shí)別了状囱,我采用的是百度的文字識(shí)別API术裸,網(wǎng)址:http://ai.baidu.com/tech/ocr。為什么用它亭枷?因?yàn)楹?jiǎn)單易用袭艺,識(shí)別準(zhǔn)確。
建一個(gè)文件getOcrData.py叨粘,將識(shí)別的數(shù)據(jù)保存在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文字識(shí)別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)] #構(gòu)造待識(shí)別圖片url列表
title = []
price = []
for pic_url in pic_urls:
item = open(pic_url, 'rb') #以二進(jìn)制讀取圖片
img = item.read()
message = client.basicGeneral(img)
for i in message.get('words_result'):
word = i.get('words')
if word[-1].isdigit(): #判斷是否是價(jià)格瘤睹,這里偷懶判斷最后1位是否為數(shù)字來(lái)判定
price.append(word)
else:
title.append(word)
data = dict(zip(title,price)) #將識(shí)別的數(shù)據(jù)以題名為鍵,以價(jià)格為值保存在字典中
print('共識(shí)別{}條數(shù)據(jù)\n'.format(len(data)))
for title, price in data.items():
writer.writerow((title,price))
f.close()
保存文件答倡,運(yùn)行轰传,得到如下圖結(jié)果:
(2)首次嘗試更新期刊價(jià)格
有了期刊的價(jià)格后,下面就要更新期刊價(jià)格了瘪撇,為什么說(shuō)是首次嘗試呢获茬?因?yàn)榘俣任淖肿R(shí)別雖說(shuō)準(zhǔn)確率較高,但也達(dá)不到100%倔既,總歸有點(diǎn)小問(wèn)題锦茁,第一次嘗試更新期刊價(jià)格的目的就是要找到哪些地方還存在問(wèn)題,然后去手動(dòng)修改一下叉存。新建updatePrice.py码俩,更新期刊價(jià)格的代碼如下:
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,并將數(shù)據(jù)轉(zhuǎn)為字典格式
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] #更新數(shù)據(jù)
print('已更新 ' + name)
else:
print('未找到 '+ name)
except TypeError:
pass
wb.save('test.xlsx')
代碼很簡(jiǎn)單歼捏,寫(xiě)好后保存稿存,運(yùn)行,發(fā)現(xiàn)有不少未找到的期刊瞳秽,手工打開(kāi)excel文件和csv文件瓣履,找出未找到的期刊名,如果是識(shí)別有問(wèn)題练俐,則手動(dòng)改回正確的袖迎,全部改好后,保存文件腺晾,再次運(yùn)行一遍updatePrice.py燕锥,搞定!