批量识别表格数据——Python调用百度云API

news2024/9/28 1:14:49

识别效果展示

原始表格

 识别处理的表格,可以看到,效果是非常好的

 

获取KEY

百度智能云 (baidu.com)

产品——文字识别——通用场景

去领取

 通用场景OCR——全部——0元领取

 去创建

填应用名称——全选——最下面应用描述——立即创建——返回应用列表

这两个key分别复制到main_GUI中的client_id和client_secret

 

第一步我们获取access_token


import requests
import json
import base64
import time

def get_access_token():
    client_id = '你的apikey'
    client_secret = '你的Secret Key'
    # client_id 为官网获取的AK, client_secret 为官网获取的SK
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(
        client_id, client_secret)
    response = requests.get(host).text
    data = json.loads(response)
    access_token = data['access_token']
    return access_token
# 获取返回信息


第二步我们获取是否识别成功的json数据

如果成功识别成功会给你一个request_id,用这个来获取excel表,也可以选择获取json数据(注意图片一点要转为base64编码,支持PNG、JPG、JPEG、BMP、TIFF、PNM、WebP)

#在这里我把文件路径放在了函数里面,可以放在外面,也可以做一个循环,识别一个文件夹里面的所有图片。
def get_info(access_token):

    request_url = "https://aip.baidubce.com/rest/2.0/solution/v1/form_ocr/request"
    # 二进制方式打开图片文件
    f = open('你需要识别的文件', 'rb')
    img = base64.b64encode(f.read())#base64编码
    params = {"image": img}
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    # if response:
    #     print(response.json())
    data_1 = response.json()
    return data_1

第三步我们获取excel表。

如果你的result_type是excel,则会给你返回一个excel网页连接,如果是json,则会返回json数据

def get_excel(requests_id, access_token):
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    pargams = {
        'request_id': requests_id,
        'result_type': 'excel'
    }
    url = 'https://aip.baidubce.com/rest/2.0/solution/v1/form_ocr/get_request_result'
    url_all = url + "?access_token=" + access_token
    res = requests.post(url_all, headers=headers, params=pargams)#访问链接获取excel下载页
    info_1 = res.json()['result']['ret_msg']
    excel_url=res.json()['result']['result_data']
    excel_1=requests.get(excel_url).content
    with open('识别结果.xls','wb+') as f:
        f.write(excel_1)
    print(info_1)

完整代码

下面是可以批量处理图片以及有一个GUI界面的代码

 

import os
import requests
import json
import base64
import time
import tkinter as tk
from tkinter import filedialog
from tkinter import ttk
# 获取access_token
def get_access_token():
    client_id = '你的apikey'
    client_secret = '你的apikey'
    # client_id 为官网获取的AK, client_secret 为官网获取的SK
    host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id={}&client_secret={}'.format(
        client_id, client_secret)
    response = requests.get(host).text
    data = json.loads(response)
    access_token = data['access_token']
    return access_token

# 获取识别结果
def get_info(access_token, image):
    request_url = "https://aip.baidubce.com/rest/2.0/solution/v1/form_ocr/request"
    # 二进制方式打开图片文件
    img = base64.b64encode(image)  # base64编码
    params = {"image": img}
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    data_1 = response.json()
    return data_1

# 获取excel
def get_excel(requests_id, access_token, image_file, output_dir):
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    pargams = {
        'request_id': requests_id,
        'result_type': 'excel'
    }
    url = 'https://aip.baidubce.com/rest/2.0/solution/v1/form_ocr/get_request_result'
    url_all = url + "?access_token=" + access_token
    res = requests.post(url_all, headers=headers, params=pargams)  # 访问链接获取excel下载页
    info_1 = res.json()['result']['ret_msg']
    excel_url = res.json()['result']['result_data']
    excel_1 = requests.get(excel_url).content
    excel_name = '第{}.xlsx'.format(image_file.split('.')[0])
    excel_path = os.path.join(output_dir, excel_name)
    with open(excel_path, 'wb+') as f:
        f.write(excel_1)
    print('图片 {} 处理完成'.format(image_file))
    print(info_1)

def process_images(input_dir, output_dir, progress_bar):
    access_token = get_access_token()
    image_files = os.listdir(input_dir)  # 获取文件夹中的所有图片文件
    total_images = len(image_files)
    for i, image_file in enumerate(image_files):
        image_path = os.path.join(input_dir, image_file)
        with open(image_path, 'rb') as f:
            image = f.read()
        data_1 = get_info(access_token, image)
        try:
            requests_id = data_1['result'][0]['request_id']
            if requests_id != '':
                print('识别完成')
        except:
            print('识别错误')
        print('正在获取excel')
        time.sleep(10)  # 延时十秒让网页图片转excel完毕,excel量多的话,转化会慢,可以延时长一点
        get_excel(requests_id, access_token, image_file, output_dir)
        progress = (i + 1) / total_images * 100
        progress_bar['value'] = progress
        progress_bar.update()

def select_input_dir():
    input_dir = filedialog.askdirectory()
    input_dir_entry.delete(0, tk.END)
    input_dir_entry.insert(tk.END, input_dir)

def select_output_dir():
    output_dir = filedialog.askdirectory()
    output_dir_entry.delete(0, tk.END)
    output_dir_entry.insert(tk.END, output_dir)

def start_processing():
    input_dir = input_dir_entry.get()
    output_dir = output_dir_entry.get()
    progress_bar['value'] = 0
    progress_bar.update()
    process_images(input_dir, output_dir, progress_bar)
    progress_bar['value'] = 100
    progress_bar.update()

# 创建GUI窗口
window = tk.Tk()
window.title("图片处理")
window.geometry("400x250")

# 输入地址
input_dir_label = tk.Label(window, text="输入地址:")
input_dir_label.pack()
input_dir_entry = tk.Entry(window, width=40)
input_dir_entry.pack()
input_dir_button = tk.Button(window, text="选择文件夹", command=select_input_dir)
input_dir_button.pack()

# 输出地址
output_dir_label = tk.Label(window, text="输出地址:")
output_dir_label.pack()
output_dir_entry = tk.Entry(window, width=40)
output_dir_entry.pack()
output_dir_button = tk.Button(window, text="选择文件夹", command=select_output_dir)
output_dir_button.pack()

# 进度条
progress_bar = ttk.Progressbar(window, orient='horizontal', length=300, mode='determinate')
progress_bar.pack()

# 开始处理按钮
start_button = tk.Button(window, text="开始处理", command=start_processing)
start_button.pack()

# 运行GUI窗口
window.mainloop()

参考:

(1条消息) Python调用百度云API识别表格识别_调用百度接口识别表格_白胖胖宋棒棒的博客-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/738002.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

抖音seo矩阵系统源码|需求文档编译说明(技术)

1.抖音seo矩阵系统文档开发流程 抖音SEO矩阵指的是一系列通过搜索引擎优化(SEO)技术和策略来提升抖音账号在搜索结果中排名的方法和工具。在抖音上,用户可以通过搜索关键词来查找与其相关的视频和账号。因此,抖音SEO矩阵的主要目…

将Notes应用中的PDF附件转为图片

大家好,才是真的好。 好久没有写专门开发方面的知识,主要是因为看的人太少。嗯,当然,这是表面上的,实际上更重要的原因是,写得很麻烦,而且看的人少。 开发要调试,代码要反复测试&a…

Java入门--变量

变量是什么? 变量是用来记住程序要处理的数据的。 变量的定义格式? 数据类型 变量名 数据 注意:这里面的 是赋值的意思,把等号右边的赋值给左边 变量名命名规则: 以字母、下划线、$ 作为首字母由字母、数字、下…

map和set介绍及使用

目录 一、什么是关联式容器 二、set 1.set的介绍 2.set的使用方法 三、mutiset 四、map 1.map简介 2.map的使用 五、multimap 一、什么是关联式容器 在了解map、set之前,你肯定已经使用过vector、list、deque、forward_list(C11)等这些容器,而他…

Jtti:linux如何查看磁盘驱动器列表?

在Linux系统中,你可以使用以下命令之一来查看磁盘驱动器列表: 1.使用 fdisk 命令:运行以下命令来查看磁盘驱动器列表: 这会列出系统中所有的磁盘驱动器及其分区。 2.使用 lsblk 命令:运行以下命令来查看磁盘驱动器列表…

SpringSecurity学习总结

目录 一、简介 二、使用 引入 登录验证流程 完整流程 三、案例(登录验证) 三、设置密码加密和解密方式 三、自定义登录 四、定义JWT认证过滤器 简介 流程 JWT(当前未使用) 定义token过滤 配置过滤器为最前 再次总结流程 五、退出登录 六、一些中间配置 七、网关…

05-流式操作:使用 Flux 和 Mono 构建响应式数据流

1 通过 Flux 对象创建响应式流 基于各种工厂模式的静态创建方法编程的方式动态创建 Flux 相对而言,静态方法在使用上都比较简单,但不如动态方法来得灵活。我们来一起看一下。 2 通过静态方法创建 Flux Reactor 中静态创建 Flux 的方法常见的包括 jus…

机器学习、深度学习、人工智能三者之间究竟是什么关系?

1 什么是人工智能 人工智能(Artificial Intelligence):人工智能是一个广泛的概念,指的是使计算机系统具备像人类一样的智能和能力。人工智能涵盖了包括机器学习和深度学习在内的各种方法和技术,旨在让计算机能够感知、…

IPO观察丨黑芝麻智能递表港交所,车芯行业已迈向量产决战期?

虽然我国汽车芯片行业还处在发展初期,但已经迸发出无限潜力。 一方面,智能汽车的发展不断带动需求增长;另一方面,政策引导下,汽车芯片企业持续抢占高地。对此,在7月5日-7日举办的2023年中国汽车论坛上&…

【数据结构二叉树OJ系列】7、构建二叉树并中序遍历

目录 题述: 思路: 正确代码: 题述: 编写一程序,读入用户输出的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。例如如下的先序遍历字符串:ABC##DE#…

C++通过回车结束循环输入

试想一个案例,假设需要你输入n行数字,而每一行输入的数字数量都未知(不定),如何通过C来实现这一操作? 本贴笔者给出一个具体案例:首先规定输入的行数,而后在每一行输入不定量的数字&…

Scratch 足球打蛤蟆

Scratch 足球打蛤蟆 本程序转换为HTML后运行。“足球”角色和角色“麦克斯”跟随鼠标,点击鼠标时“足球”角色复制并向鼠标方向开始移动,碰到边缘反弹,移动一定步数后删除。“蛤蟆”角色每0.5秒在随机位置和方向生成,碰到足球角色…

精彩回顾 | 模型与数据驱动工业数智化——Modelica暨装备数字化研讨会(2023)圆满召开

2023年6月30日,以“模型与数据驱动工业数智化”为主题的Modelica暨装备数字化研讨会(2023)在江苏省苏州市隆重召开。会议由苏州同元软控信息技术有限公司(简称“同元软控”)与哈尔滨工业大学计算学部等单位联合主办&am…

信息文档管理与配置管理

目录 ​编辑 一、软件文档的分类 1.1 开发文档 1.2 产品文档 1.3 管理文档 二、文档质量等级划分 2.1 1级文档 2.2 内部文档(2级) 2.3 工作文档(3级) 2.4 正式文档(4级) 三、配置管理 3.1 配置管理的定义 3.2 配置管理的6个主要…

F5是什么意思?聊聊你所不知道的F5

5月底,有幸参加了F5 Forum 科技趋势峰会,这让我不仅关注数字化企业和应用服务的技术趋势,也对华丽转型后的F5有了更深入的了解。如果你对F5是什么意思尚且存在疑问,那这篇文章我们就聊聊我眼中的F5,这个应用及API交付和…

编程(44)----------MySQL索引存储

MySQL的索引存储使用的并非像其展示出的那样以类似表格的方式. 而是以B数的方式存储. 在此之前先了解一下作为前身的B树 首先明确, 无论如何数据库中的存储方式都是树型. 而B树其实就是多叉树. 其结构大概如图所示. 假设根节点中存储了key1为5 33 这两个数据. 那其子节点就以这…

CYCLO(GLY-L-PHE),10125-07-2,环(甘氨酰-L-苯丙氨酰),具有生物活性的光学异构体

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ cyclo(Gly-Phe),CYCLO(-GLY-PHE),CYCLO(GLY-L-PHE),Cyclo(-Gly-L-Phe)≥ 95% (HPLC) 环(甘氨酰-L-苯丙氨酰)Product structure: Product specifications: 1.CAS N…

软件测试工程师必备的SQL语句基础

文末有惊喜 为一个软件测试工程师,我们在测试过程中往往需要对数据库数据进行操作,但是我们的操作大多以查询居多,有时会涉及到新增,修改,删除等操作,所以我们其实并不需要对数据库的操作有特别深入的了解&…

vscode使用Eslint+Prettier格式化代码

1、安装Eslint插件和Prettier插件 2、 安装eslint npm install eslint -g1)、初始化项目 npm init -y 2)、生成eslint配置文件 npx eslint --init 完之后生成一个.eslintrc.json的文件 二、vscode配置 1、vscode需要配置保存自动化格式 设置 ->…

QWebEngine应用---基于QWebChannel实现网页与qt层交互

Qt提供了QWebChannel实现和网页的通信,我们直接拿github上一个能直接运行的demo来做说明,demo是基于Widget,且页面是自己实现的页面,接着会介绍基于QML实现且页面是第三方网站如何使用的。 QWebChannel用法 我们先看看demo的运行…