python實現excel表格圖片識別,并轉換成excel文件
這個過程有點多,一步一步來。
一、文字識別
本人采用的是騰訊的云識別技術,所以先在騰訊完成一系列的注冊、申請工作。
首先打開騰訊云的官網:
點擊“入門”,這里面有大概需要的步驟:
開通文字識別的服務后:
這個按官方的說法是每個月可以免費使用1000次,還是很不錯的。
開通服務后,還需要訪問API的密鑰,這個也需要申請,我這個是已申請好的:
二、實現效果
一張圖片:
實現后的效果:
三、預安裝相應的包
首先,要安裝騰訊的組件包:-sdk-。直接在線安裝好像不得行,于是可以安裝離線版,我這里下載后再安裝的,包的名字叫:
pip hon-3.0.330-py2.py3-none-any.whl
然后還安裝了一個包:
pip -2.0.0-py2.py3-none-any.whl
這兩個包我已經上傳了:
我的機子只安裝了這兩個,如果控制臺有提示缺少包,可以自行再安裝。
四、實現
經過前面準備工作,下面把相應的代碼貼出來:
.py:
# -*- coding: utf-8 -*-
import sys
import ocr
import xlrd
import yaml_class
from xlutils.copy import copy
pic_path = sys.argv[1]
print('doing...',pic_path)
# 使用ocr進行轉換
config = yaml_class.get_yaml_data("config.yml")
trans = ocr.OCR()
path_excel = trans.img_to_excel(
pic_path,
image_path=pic_path,
secret_id=config['secret_id'],
secret_key=config['secret_key'],
)
old_excel = xlrd.open_workbook('output.xlsx')
new_excel = copy(old_excel)
ws = new_excel.get_sheet(0)
new_excel.save(pic_path+'.xls')
ocr.py:
# -*- coding: utf-8 -*-
from tencentcloud.common import credential
from tencentcloud.common.profile.client_profile import ClientProfile
from tencentcloud.common.profile.http_profile import HttpProfile
from tencentcloud.ocr.v20181119 import ocr_client, models
import base64
# OCR識別封裝
class OCR(object):
def img_to_excel(self,
output_file_name,
image_path,
secret_id,
secret_key):
# 實例化一個認證對象,入參需要傳入騰訊云賬戶secretId,secretKey
cred = credential.Credential(
secret_id,
secret_key
)
# 實例化client對象
httpProfile = HttpProfile()
httpProfile.endpoint = "ocr.tencentcloudapi.com"
clientProfile = ClientProfile()
clientProfile.httpProfile = httpProfile
clientProfile.signMethod = "TC3-HMAC-SHA256"
client = ocr_client.OcrClient(cred, "ap-shanghai", clientProfile)
# 實例化一個請求對象
req = models.GeneralFastOCRRequest()
# 讀取圖片數據,使用Base64編碼
with open(image_path, 'rb') as f:
image = f.read()
image_base64 = str(base64.b64encode(image), encoding='utf-8')
req.ImageBase64 = image_base64
# 通過client對象調用訪問接口,傳入請求對象
resp = client.TableOCR(req)
# 獲取返回數據(Data為Base64編碼后的Excel數據)
data = resp.Data
# 轉換為Excel
output_file_name = str(output_file_name)
path_excel = output_file_name+".xlsx"
with open(path_excel, 'wb') as f:
f.write(base64.b64decode(data))
return path_excel
yaml讀取配置文件(.py):
# -*- coding: utf-8 -*-
import yaml
def get_yaml_data(yaml_file):
# 打開yaml文件
file = open(yaml_file, 'r', encoding="utf-8")
file_data = file.read()
file.close()
# 將字符串轉化為字典或列表
data = yaml.load(file_data)
return data
.yml:
# -*- coding: utf-8 -*-
secret_id: AKIDPzLSHRK3bZUCSyCF3Z45Bj0LRHs0Ynzb
secret_key: Qa5QeYKwIQI4ZxDQFq663jIs********
雖然沒得講得很詳細,但基本步驟就是這些,這樣就可以利用騰訊的云服務,把圖片識別出來,再轉換成文件。
(2021.2.1更新)
上面ocr.py代碼更詳細的解釋,可以看官方的例子: / -sdk-
ocr.py是改裝的關鍵,所以最近又深入了解了一下,甚至可以看看源代碼:.py與.py源代碼
文字識別,也分很多種接口,通用文字、卡證文字、票據單據、汽車相關、行業文檔等多場景下的印刷體、手寫體文字識別:
每個人的需求不同,所以很有必要深入學習下。比如表格識別,就有兩個版本:
而我們上面的ocr.py采用的是V1版本,現在已經不推薦使用了,可以改成V2版本。V2版本的公共接口是,對應上面的代碼改動如下:
# 通過client對象調用訪問接口,傳入請求對象
resp = client.RecognizeTableOCR(req)
另外,還有一個比較關鍵的東西,那就是識別對象是哪種,印刷體,還是手寫體、英文體?上面的ocr.py用的是,即印刷體。
總的來說,ocr.py作用的就是通過識別印刷字體,然后通過轉換成表格。如果需要識別手寫體怎么辦?
需要修改.t:
# 實例化一個請求對象
req = models.GeneralHandwritingOCRRequest()
...
# 通過client對象調用訪問接口,傳入請求對象
resp = client.RecognizeTableOCR(req)
data = resp.Data
還有那個服務器地域,可以取以下值:
華北地區(北京)
ap-
華南地區(廣州)
ap-
港澳臺地區(中國香港)
ap-
亞太東北(首爾)
ap-
華東地區(上海)
ap-
亞太東南(新加坡)
ap-
北美地區(多倫多)
na-
也就是離哪個服務器近就選哪個。
聲明:本站所有文章資源內容,如無特殊說明或標注,均為采集網絡資源。如若本站內容侵犯了原著者的合法權益,可聯系本站刪除。