GLM-OCR数据管道构建:使用Python实现从原始图片到结构化JSON的全流程

📅 发布时间:2026/7/6 22:43:47 👁️ 浏览次数:
GLM-OCR数据管道构建:使用Python实现从原始图片到结构化JSON的全流程
GLM-OCR数据管道构建使用Python实现从原始图片到结构化JSON的全流程你是不是经常遇到一堆图片里面包含了各种文字信息比如发票、名片、文档截图然后需要手动把这些信息一个个敲到电脑里这个过程不仅枯燥还容易出错。今天我就带你用Python搭建一个“自动化小助手”。它能自动盯着一个文件夹一旦有新的图片丢进去就立刻调用智能识别接口把图片里的文字读出来然后像个小秘书一样把杂乱无章的文本整理得干干净净最后打包成规整的JSON数据存起来。整个过程完全不用你动手省时省力。我们主要会用到几个Python里非常实用的模块os用来和电脑文件夹打交道requests去调用网络接口json来处理最终的数据格式。即使你刚学Python不久跟着步骤走也能把这个小项目跑起来。1. 项目准备理清思路与搭建环境在开始写代码之前我们得先想清楚这个“小助手”要怎么工作。它的核心任务是一个流水线监控眼睛盯着指定的文件夹看看有没有新图片进来。识别发现新图片后调用GLM-OCR服务把图片变成原始文本。清洗原始文本可能有很多空格、换行或者无关字符需要清洗干净。抽取从清洗后的文本里根据我们的规则比如用正则表达式找出关键信息比如日期、金额、电话号码等。打包把抽出来的信息按照固定的格式比如字典组装好。保存把组装好的数据转换成JSON格式存到文件里方便以后使用。整个流程就像一条工厂生产线原料图片从一端进去成品结构化JSON就从另一端出来了。1.1 环境与工具准备你不需要安装特别复杂的软件只要确保电脑上有Python 3.6或以上的版本就行。我们可以通过命令行来检查并安装必要的“工具包”。打开你的命令行工具Windows上是CMD或PowerShellMac或Linux上是Terminal输入以下命令来安装我们需要的库pip install requestsrequests库是用来和GLM-OCR的API服务器“对话”的我们通过它发送图片接收识别结果。Python标准库里的os、json、re正则表达式和time都是自带的不用额外安装。至于GLM-OCR的API你需要有一个可访问的接口地址URL以及必要的认证信息比如API Key。这部分需要你根据自己使用的具体服务来准备我会在代码里用YOUR_API_URL和YOUR_API_KEY作为占位符记得替换成你自己的。1.2 创建项目文件夹结构为了让项目整洁我建议你在电脑上新建一个文件夹比如叫做glm_ocr_pipeline。在里面再创建两个子文件夹input_images/用来存放需要识别的原始图片。output_json/用来保存程序处理完成后生成的JSON文件。你的文件夹看起来应该是这样glm_ocr_pipeline/ ├── input_images/ ├── output_json/ └── main.py (我们即将要写的Python脚本)2. 核心步骤一调用GLM-OCR API识别图片文字首先我们来解决最核心的问题怎么让电脑“看懂”图片里的字。这里我们假设GLM-OCR服务提供了一个通过HTTP请求调用的API。我们写一个函数专门负责这件事。它的工作就是接收一张图片的路径然后“打包”好请求发送给远方的服务器最后把服务器返回的文字结果带回来。import requests import json import base64 def ocr_image(image_path, api_url, api_key): 调用GLM-OCR API识别单张图片中的文字。 参数: image_path (str): 图片文件的本地路径。 api_url (str): GLM-OCR API的完整地址。 api_key (str): 用于认证的API Key。 返回: str: 识别出的原始文本字符串。如果失败返回None。 # 1. 读取图片文件并编码为Base64格式这是一种常见的API传输方式 try: with open(image_path, rb) as image_file: image_data base64.b64encode(image_file.read()).decode(utf-8) except FileNotFoundError: print(f错误找不到图片文件 {image_path}) return None # 2. 构造请求头通常API Key会放在这里 headers { Content-Type: application/json, Authorization: fBearer {api_key} # 根据实际API要求调整格式 } # 3. 构造请求体将Base64图片数据和其他参数放进去 payload { image: image_data, # 可能还有其他参数如 detect_direction: True请参考你的API文档 } # 4. 发送POST请求到API服务器 try: response requests.post(api_url, headersheaders, datajson.dumps(payload), timeout30) response.raise_for_status() # 如果状态码不是200会抛出异常 except requests.exceptions.RequestException as e: print(f调用OCR API时发生网络错误: {e}) return None # 5. 解析返回的JSON数据提取文本字段 try: result response.json() # 这里需要根据你使用的GLM-OCR API的实际返回结构来调整 # 例如可能是 result[text] 或 result[data][text] raw_text result.get(text, ) if not raw_text: print(f警告API返回的文本内容为空。完整响应: {result}) return raw_text except (json.JSONDecodeError, KeyError) as e: print(f解析API响应时发生错误: {e}。响应内容: {response.text[:200]}...) return None # 使用示例 (记得替换成你的真实信息) if __name__ __main__: # 这是测试部分正式程序里不会直接运行 test_text ocr_image( image_path./input_images/test_receipt.jpg, api_urlYOUR_API_URL_HERE, api_keyYOUR_API_KEY_HERE ) if test_text: print(识别出的原始文本) print(test_text)这段代码的关键点在于payload的构造和result的解析你必须根据你所用的GLM-OCR服务的官方文档来调整。比如有的API可能要求图片以二进制文件流files的形式上传而不是Base64返回结果里文本的字段名也可能是content、ocr_result等等。3. 核心步骤二文本清洗与关键信息抽取OCR识别出来的文字通常很“毛糙”夹杂着不必要的空格、换行符排版也可能乱七八糟。接下来我们就要扮演“数据清洗工”和“信息侦探”的角色。3.1 使用正则表达式进行文本清洗正则表达式就像一把万能的手术刀可以精准地找到并处理文本中的特定模式。我们先处理一些常见杂音。import re def clean_ocr_text(raw_text): 清洗OCR识别出的原始文本。 if not raw_text: return cleaned_text raw_text # 1. 替换多个连续的空格、制表符为单个空格 cleaned_text re.sub(r\s, , cleaned_text) # 2. 移除文本开头和结尾的空格 cleaned_text cleaned_text.strip() # 3. 可选处理一些常见的OCR错误比如将0识别为O # cleaned_text cleaned_text.replace(O, 0) # 谨慎使用可能会误伤 # 4. 移除或替换一些特殊字符根据你的需求调整 # 例如只保留中文、英文、数字和常见标点 # pattern re.compile(r[^\u4e00-\u9fa5a-zA-Z0-9\s.,。!?、%$]) # cleaned_text pattern.sub(, cleaned_text) return cleaned_text # 测试清洗函数 dirty_text 商品名称 Python入门书籍 \n\n 价格 99.00元 print(清洗前, repr(dirty_text)) print(清洗后, repr(clean_ocr_text(dirty_text)))3.2 从清洗后文本中抽取关键信息清洗之后文本整齐多了。现在我们要从中找出有价值的信息。假设我们处理的图片是简单的购物小票我们想抽出“商品名”和“总金额”。def extract_info_from_text(cleaned_text): 从清洗后的文本中抽取结构化信息。 这是一个示例你需要根据你的图片内容定制规则。 extracted_info { 商品名称: None, 总金额: None, 识别日期: None, 原始文本摘要: cleaned_text[:100] ... if len(cleaned_text) 100 else cleaned_text } # 示例1使用正则表达式查找“商品名称xxx”或“商品名xxx”模式 # (?:...)表示非捕获分组只用于匹配但不提取 name_pattern re.compile(r商品名称[:]\s*([^\s。])) name_match name_pattern.search(cleaned_text) if name_match: extracted_info[商品名称] name_match.group(1) # 示例2查找金额匹配如 99.00, 120, $50.5 等格式 # \d 匹配数字\.?\d* 匹配可选的小数部分[元美元]? 匹配可选的单位 amount_pattern re.compile(r[$]?\s*(\d(?:\.\d)?)\s*[元美元]?) amount_matches amount_pattern.findall(cleaned_text) if amount_matches: # 假设最后一个金额是总金额实际情况可能更复杂 try: extracted_info[总金额] float(amount_matches[-1]) except ValueError: extracted_info[总金额] amount_matches[-1] # 示例3查找日期匹配如 2023-10-27, 2023/10/27 等格式 date_pattern re.compile(r(\d{4})[-/年](\d{1,2})[-/月](\d{1,2})日?) date_match date_pattern.search(cleaned_text) if date_match: extracted_info[识别日期] f{date_match.group(1)}-{date_match.group(2).zfill(2)}-{date_match.group(3).zfill(2)} return extracted_info # 测试抽取函数 test_cleaned_text 商品名称Python入门书籍 价格99.00元 日期2023-10-27 info extract_info_from_text(test_cleaned_text) print(抽取到的信息, json.dumps(info, ensure_asciiFalse, indent2))这里是最需要你动脑筋的地方。extract_info_from_text函数里的规则正则表达式必须根据你实际要处理的图片内容来量身定制。如果是名片你可能要抽姓名、电话、邮箱如果是发票可能要抽发票号、开票方、税额。规则越精准抽出来的信息就越可靠。4. 核心步骤三组装完整的数据管道现在零件都准备好了能识别的ocr_image、能清洗的clean_ocr_text、能抽取的extract_info_from_text。我们还需要一个“总控程序”来把它们串联起来并加上文件夹监控和保存功能。4.1 监控文件夹与处理单张图片我们让程序定期检查input_images/文件夹处理新出现的图片文件。import os import time from datetime import datetime def process_single_image(image_path, api_url, api_key, output_dir./output_json): 处理单张图片的完整流程识别 - 清洗 - 抽取 - 保存。 print(f开始处理图片: {os.path.basename(image_path)}) # 步骤1: OCR识别 raw_text ocr_image(image_path, api_url, api_key) if raw_text is None: print(f - OCR识别失败跳过此图片。) return False # 步骤2: 文本清洗 cleaned_text clean_ocr_text(raw_text) # 步骤3: 信息抽取 structured_data extract_info_from_text(cleaned_text) # 为数据添加一些元信息 structured_data.update({ source_image: os.path.basename(image_path), process_timestamp: datetime.now().isoformat(), full_text_length: len(cleaned_text) }) # 步骤4: 保存为JSON文件 # 使用图片名作为JSON文件名 json_filename os.path.splitext(os.path.basename(image_path))[0] .json json_path os.path.join(output_dir, json_filename) try: with open(json_path, w, encodingutf-8) as f: json.dump(structured_data, f, ensure_asciiFalse, indent2) print(f - 成功结果已保存至: {json_path}) return True except IOError as e: print(f - 保存JSON文件时出错: {e}) return False4.2 实现持续监控与主循环最后我们编写主函数让整个管道持续运行起来。def main_monitor_loop(input_dir./input_images, check_interval5): 主监控循环定期扫描输入文件夹并处理新图片。 # 替换为你的真实API信息 API_URL YOUR_API_URL_HERE API_KEY YOUR_API_KEY_HERE OUTPUT_DIR ./output_json # 确保输出目录存在 os.makedirs(OUTPUT_DIR, exist_okTrue) os.makedirs(input_dir, exist_okTrue) print(fGLM-OCR数据管道已启动。) print(f监控文件夹: {os.path.abspath(input_dir)}) print(f输出文件夹: {os.path.abspath(OUTPUT_DIR)}) print(f扫描间隔: {check_interval} 秒) print(等待图片放入输入文件夹... (按 CtrlC 停止)) # 用一个集合记录已经处理过的图片避免重复处理 processed_files set() try: while True: # 获取输入文件夹下所有支持的图片文件 # 你可以根据需要扩展支持的文件类型 supported_extensions {.jpg, .jpeg, .png, .bmp} current_files { f for f in os.listdir(input_dir) if os.path.splitext(f)[1].lower() in supported_extensions } # 找出新文件当前存在但未被处理过的 new_files current_files - processed_files for filename in new_files: filepath os.path.join(input_dir, filename) # 确保是文件而不是文件夹 if os.path.isfile(filepath): success process_single_image(filepath, API_URL, API_KEY, OUTPUT_DIR) if success: processed_files.add(filename) # 只有成功处理后才加入已处理集合 # 这里可以添加逻辑比如处理成功后是否移动或删除原图 # os.remove(filepath) # 谨慎使用删除 if not new_files: # 没有新文件时打印一个简单的点表示程序在运行避免刷屏 print(., end, flushTrue) else: print() # 换行 time.sleep(check_interval) # 等待一段时间后再次检查 except KeyboardInterrupt: print(\n\n管道监控已被用户中断。) except Exception as e: print(f\n程序运行发生未知错误: {e}) if __name__ __main__: # 启动监控循环 main_monitor_loop()把这个main.py脚本放到你的项目根目录下在命令行里运行python main.py整个自动化管道就开始工作了。试着往input_images/文件夹里丢一张带有文字的图片看看output_json/文件夹里会不会神奇地出现一个同名的、内容整洁的JSON文件。5. 总结与后续优化建议走完这一趟你应该已经成功搭建起一个能自动运行的GLM-OCR数据管道了。从图片进去到结构化数据出来整个过程基本实现了自动化这比手动处理效率高太多了。实际用起来你可能会发现一些可以打磨的地方。比如现在的信息抽取规则正则表达式可能不够强壮遇到格式稍微不一样的图片就抽不准了。这时候你可以考虑把规则写得更灵活或者针对不同类型的图片发票、名片、宣传单准备多套规则让程序先判断图片类型再选用对应的规则。另外现在的程序是“一次性”的如果处理到一半程序关了重启后它会重新处理所有图片。对于更严肃的用途你可能需要把处理状态比如已处理的文件名记录在一个小数据库或文件里实现断点续处理。这个项目也是一个很好的学习起点。你可以试着给它加个图形界面让操作更直观或者把保存的JSON数据自动导入到Excel或数据库里甚至可以把多个步骤包装成一个简单的Web服务让其他人也能通过网页上传图片并下载结果。思路打开能玩的花样还有很多。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。