其他
数据治理 | 还在人工识别表格呢?Python 调用百度 OCR API 又快又准
目录
一、前言
二、注册百度AI平台,申请API
三、识别表格PDF
安装Python包
PDF 文档转为图片
调用API,将图片识别为Excel表
批量识别并合并为一张表
四、总结
本文共4115个字,阅读大约需要12分钟,欢迎指正!
Part1前言
Part2注册百度 AI 平台,申请 API
https://ai.baidu.com/forum/topic/show/867951
。Part3识别表格 PDF
1安装 Python 包
baidu-aip
库,在命令提示符中输入以下命令安装:pip install baidu-aip
2PDF 文档转为图片
import fitz
# 下面是待转换 PDF 的路径
pdf = './TEST/2019-2020 年全国碳排放权交易前2-4页.pdf'
doc = fitz.open(pdf)
for pg in range(doc.pageCount):
page = doc[pg] # 选择一页
rotate = 0
# 设置参数调整图片的质量
X_, Y_ = 4, 4
mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)
pix = page.get_pixmap(matrix=mat, alpha=False)
pix.save(f"./TEST/Pic/Page_{pg}.png")
3调用 API,将图片识别为 Excel 表
from aip import AipOcr # 导入第一步安装的库
APP_ID = '根据实际填写'
API_KEY = '根据实际填写'
SECRET_KEY = '根据实际填写'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY) # 根据 API key 生成客户端
img = open("./TEST/Pic/Page_0.png",'rb').read() # 以二进制方式打开图片
table = client.tableRecognitionAsync(img) # 调用 API 表格服务
print(table) # 查看 API 返回结果
request_id
来获取识别的状态和识别的结果,代码如下:ID = table['result'][0]['request_id'] # 取出 request_id
result = client.getTableRecognitionResult(ID) # 根据 id 尝试获取识别结果
result # 查看请求结果
import requests # 使用 requests 库抓取数据
dataurl = result['result']['result_data'] # 请求结果的 url
data = requests.get(dataurl) # 根据 url 获取数据
# 在我们希望的文件夹下新建一个 Excel 表,将识别的结果写入其中
with open("./TEST/识别结果/table_Page_0.xlsx", 'wb') as excel: # .表示Python当前工作目录
excel.write(data.content) # 将识别结果写入 Excel
excel.close()
4批量识别并合并为一张表
import time, requests, glob
from aip import AipOcr
import pandas as pd
APP_ID = '根据实际填写'
API_KEY = '根据实际填写'
SECRET_KEY = '根据实际填写'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
path_list = glob.glob('./TEST/Pic/*.png') # 获取 Pic 目录下所有 png 图片的路径
for pic_path in path_list:
# 遍历所有图片的路径列表
img = open(pic_path,'rb').read() # 加载图片
table = client.tableRecognitionAsync(img) # 调用表格识别 API 进行识别
request_id = table['result'][0]['request_id'] # API 返回的请求 ID
# 下面每隔两秒查看识别状态,直到识别完成,即可抓取识别结果
result = client.getTableRecognitionResult(request_id)
while result['result']['ret_msg'] != '已完成':
# 通过 ID 获取识别结果,直至识别完成
time.sleep(2)
result = client.getTableRecognitionResult(request_id)
dataurl = result['result']['result_data'] # 识别完成后结果存储的 url
# 将结果写入 Excel 表,与图片同名
imgname = pic_path.split('\\')[-1].split('.')[0]
with open(f'./TEST/excel/{imgname}.xlsx', 'wb') as excel:
excel.write(requests.get(dataurl).content)
# 以上代码运行后,会在事先创建的 excel 文件夹下中生成三份 excel 表
# 接下来我们使用 Pandas 将他们合并为一张表(前提是这三张表结构一致,即字段名一样)。
excel_paths = glob.glob('./TEST/excel/*.xlsx')
DATA = pd.DataFrame()
for path in excel_paths:
Page_df = pd.read_excel(path)
DATA = pd.concat([DATA, Page_df])
# 将合并的表保存为 Excel 表
DATA.to_excel('./TEST/excel/2019-2020 年全国碳排放权交易前2-4页.xlsx', index=False)
💡 提示:任何 OCR 产品都无法保证 100% 的识别准确率,如果你的数据非常非常重要,请谨慎使用 OCR 功能,或者使用后进行人工核对。
Part4总结
我们将在数据治理板块中推出一系列原创推文,帮助读者搭建一个完整的社科研究数据治理软硬件体系。该板块将涉及以下几个模块(点击标题即可跳转至相应合集):
星标⭐我们不迷路!想要文章及时到,文末“在看”少不了!
点击搜索你感兴趣的内容吧
往期推荐
数据Seminar
这里是大数据、分析技术与学术研究的三叉路口
文 | 两米哥
欢迎扫描👇二维码添加关注