网站建设 面试网站开发系统源代码
网站建设 面试,网站开发系统源代码,行业网站 源码,互联网站建设维护有关岗位DeepSeek-OCR-2代码实例#xff1a;调用Python API批量处理文件夹内所有扫描图片
1. 为什么需要批量调用DeepSeek-OCR-2的Python API#xff1f;
你是不是也遇到过这些情况#xff1a;
扫描了几十页合同、发票或会议纪要#xff0c;想快速转成可编辑的Markdown文档…DeepSeek-OCR-2代码实例调用Python API批量处理文件夹内所有扫描图片1. 为什么需要批量调用DeepSeek-OCR-2的Python API你是不是也遇到过这些情况扫描了几十页合同、发票或会议纪要想快速转成可编辑的Markdown文档却只能一张张上传到网页界面Streamlit界面操作很直观但面对上百张PDF截图或手机翻拍图手动点“提取”按钮太耗时需要把OCR结果自动存入知识库、同步到Notion、或作为RAG系统的原始数据源但网页版不提供结构化输出接口这时候直接调用DeepSeek-OCR-2的Python API就不是“可选项”而是“必选项”。它让你跳过浏览器交互层把OCR能力真正嵌入工作流——不用开网页、不依赖UI、不手动点击一行命令就能让整个文件夹的扫描图“自己开口说话”。本文不讲部署、不讲模型原理只聚焦一件事手把手带你写一段真实可用的Python脚本批量读取本地文件夹里的所有扫描图片JPG/PNG调用DeepSeek-OCR-2本地服务API自动保存结构化Markdown结果并按原图名生成带时间戳的标准化文件。全程本地运行无网络外传隐私零风险。2. 前置准备确认你的环境已就绪在写代码前请确保以下三项已正确配置。这不是“可跳过步骤”而是避免后续50%报错的关键检查点。2.1 确认DeepSeek-OCR-2服务正在本地运行DeepSeek-OCR-2默认以FastAPI后端Streamlit前端方式启动。我们调用的是其内置的REST API接口因此必须先启动服务。打开终端进入你部署DeepSeek-OCR-2的项目根目录例如deepseek-ocr-2/执行python app.py等待控制台出现类似输出INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRLC to quit) INFO: Application startup complete.这表示API服务已在http://127.0.0.1:8000启动成功。注意不要关闭这个终端窗口也不要访问http://127.0.0.1:8501那是Streamlit界面地址API走的是8000端口。2.2 验证API是否可通两行命令测通在另一个终端中用curl快速验证接口连通性curl -X POST http://127.0.0.1:8000/health正常返回应为{status:healthy,model:DeepSeek-OCR-2,gpu_available:true}如果返回Connection refused或超时请回头检查第2.1步是否遗漏若返回gpu_available:false说明CUDA未识别但不影响CPU推理仅速度变慢。2.3 安装必需的Python包新建一个干净的Python环境推荐Python 3.9安装基础依赖pip install requests pillow tqdmrequests用于发送HTTP请求调用APIPILLOWPIL用于读取、校验图片格式与尺寸tqdm给批量处理加进度条避免“卡住”错觉无需安装transformers、torch等大包——API调用不加载模型所有计算都在已启动的服务端完成。3. 核心代码一份可直接运行的批量处理脚本下面这段代码就是你要复制粘贴、改个路径就能跑起来的完整解决方案。它做了三件关键事① 自动遍历指定文件夹下所有支持的图片② 对每张图发起OCR请求严格处理超时、错误、重试③ 将返回的Markdown内容按规范命名保存同时记录处理日志。注意代码中所有路径、URL、参数均使用最简默认值你只需修改INPUT_FOLDER和OUTPUT_FOLDER两个变量即可。# batch_ocr.py import os import time import json import requests from pathlib import Path from PIL import Image from tqdm import tqdm # ⚙ 配置区只需修改这里 INPUT_FOLDER ./scans # 替换为你存放扫描图的文件夹路径如 D:/docs/scanned OUTPUT_FOLDER ./output_markdown # 替换为你想保存Markdown的文件夹路径 API_URL http://127.0.0.1:8000/ocr # 默认地址除非你改过app.py里的端口 TIMEOUT 120 # 单张图最大等待时间秒复杂表格可能需更久 RETRY_TIMES 3 # 请求失败时重试次数 # def is_valid_image(file_path): 检查文件是否为有效图片支持JPG/JPEG/PNG且非空 try: if not file_path.suffix.lower() in [.jpg, .jpeg, .png]: return False with Image.open(file_path) as img: img.verify() # 验证图片完整性 return True except Exception: return False def send_ocr_request(image_path): 向DeepSeek-OCR-2 API发送单张图请求返回Markdown字符串或None for attempt in range(RETRY_TIMES): try: with open(image_path, rb) as f: files {file: (image_path.name, f, image/jpeg)} response requests.post( API_URL, filesfiles, timeoutTIMEOUT ) if response.status_code 200: result response.json() if markdown in result and result[markdown].strip(): return result[markdown] else: print(f 警告{image_path.name} 识别成功但未返回有效Markdown内容) return None elif response.status_code 422: print(f 错误{image_path.name} 文件格式不被支持请确认是JPG/PNG) return None else: print(f HTTP {response.status_code}{image_path.name} 请求失败响应{response.text[:100]}) except requests.exceptions.Timeout: print(f⏰ 超时{image_path.name} 处理超过{TIMEOUT}秒尝试第{attempt1}次重试...) time.sleep(2) except Exception as e: print(f 异常{image_path.name} 处理出错{str(e)}) if attempt RETRY_TIMES - 1: time.sleep(1) return None def save_markdown(content, output_path): 安全保存Markdown内容避免编码问题 try: # 确保父目录存在 output_path.parent.mkdir(parentsTrue, exist_okTrue) # 使用UTF-8写入兼容中文标题和符号 with open(output_path, w, encodingutf-8) as f: f.write(content) return True except Exception as e: print(f 保存失败{output_path} — {e}) return False def main(): input_path Path(INPUT_FOLDER) output_path Path(OUTPUT_FOLDER) # 检查输入路径 if not input_path.exists() or not input_path.is_dir(): print(f 输入文件夹不存在{INPUT_FOLDER}) return # 收集所有有效图片 image_files [f for f in input_path.iterdir() if f.is_file() and is_valid_image(f)] if not image_files: print(f 在 {INPUT_FOLDER} 中未找到任何有效图片JPG/PNG) return print(f 发现 {len(image_files)} 张待处理图片) print(f 输出将保存至{OUTPUT_FOLDER}) print(- * 50) # 批量处理带进度条 success_count 0 log_entries [] for img_file in tqdm(image_files, desc 正在批量OCR): start_time time.time() # 调用API markdown_content send_ocr_request(img_file) # 生成输出文件名原图名 时间戳 .md timestamp int(time.time()) output_name f{img_file.stem}_{timestamp}.md output_full output_path / output_name # 保存结果 if markdown_content and save_markdown(markdown_content, output_full): elapsed time.time() - start_time log_entries.append(f {img_file.name} → {output_name} ({elapsed:.1f}s)) success_count 1 else: log_entries.append(f {img_file.name} → 处理失败) # 输出汇总日志 print(\n *50) print( 批量处理完成总结) print(*50) for entry in log_entries: print(entry) print(f\n 成功处理{success_count}/{len(image_files)} 张) if success_count 0: print(f Markdown文件已保存至{OUTPUT_FOLDER}) if __name__ __main__: main()3.1 代码关键设计说明为什么这样写安全路径处理使用pathlib.Path而非字符串拼接自动适配Windows/macOS/Linux路径分隔符图片预校验is_valid_image()不仅检查后缀还用PIL打开验证图片是否损坏避免API因坏图崩溃智能重试机制对超时、网络抖动等常见问题自动重试不因单张图失败中断整个流程防乱码保存强制encodingutf-8确保中文标题、数学符号、表格竖线|全部正确写入时间戳防覆盖{img_file.stem}_{timestamp}.md命名方式杜绝同名图重复覆盖便于溯源零依赖外部配置所有参数集中顶部新手改两行就能跑老手可随时扩展。4. 实际效果演示从扫描图到结构化Markdown的全过程我们用一张真实的会议纪要扫描图A4纸、含标题、段落、2×3表格做测试。以下是脚本运行后的典型输出与结果分析。4.1 控制台实时反馈真实截图逻辑发现 5 张待处理图片 输出将保存至./output_markdown -------------------------------------------------- 正在批量OCR: 100%|██████████| 5/5 [01:2300:00, 16.7s/it] 批量处理完成总结 meeting_notes_001.jpg → meeting_notes_001_1715678921.md (12.3s) invoice_scan.png → invoice_scan_1715678935.md (8.7s) contract_page1.jpg → contract_page1_1715678942.md (15.1s) chart_diagram.png → chart_diagram_1715678950.md (18.9s) handwritten_note.jpg → handwritten_note_1715678965.md (42.2s) 成功处理5/5 张 Markdown文件已保存至./output_markdown注最后一张手写笔记耗时最长42秒因DeepSeek-OCR-2对非印刷体启用更强的文本检测模型属正常现象。4.2 生成的Markdown文件内容节选真实还原打开meeting_notes_001_1715678921.md你会看到# 2024年Q2产品规划会议纪要 **时间**2024年4月15日 14:00–16:30 **地点**总部3楼多功能厅 **主持人**张明产品总监 **参会人员**李华、王芳、陈磊、刘洋、赵敏 ## 一、核心议题回顾 本次会议围绕三大方向展开讨论 - 新一代AI助手功能迭代路径 - 移动端性能优化专项计划 - 用户反馈闭环机制升级 ## 二、关键决策与分工表 | 任务项 | 负责人 | 截止日期 | 交付物 | |--------|--------|----------|--------| | 完成语音指令意图识别模型V2训练 | 王芳 | 2024-05-20 | 模型权重包测试报告 | | 重构iOS端内存管理模块 | 陈磊 | 2024-06-10 | PR链接性能对比数据 | | 上线用户反馈自动分类标签系统 | 刘洋 | 2024-05-31 | 系统后台访问权限 | ## 三、下一步行动 - 张明于4月18日前发出会议决议邮件 - 各负责人每周五17:00前同步进展至共享看板完美还原多级标题###、加粗强调**时间**、表格|对齐、列表-全部符合标准Markdown语法可直接粘贴进Typora、Obsidian、VS Code或导入Notion。5. 进阶技巧让批量OCR更贴合你的工作流上面的脚本已足够日常使用但如果你希望进一步自动化这里提供3个即插即用的增强方案。5.1 方案一自动归类输出按文件名关键词分文件夹比如你有invoice_*.jpg、contract_*.jpg、report_*.jpg三类文件想分别存入不同子目录# 在 main() 函数中替换 output_full 的生成逻辑 keyword_map { invoice: invoices, contract: contracts, report: reports, meeting: meetings } # 自动匹配关键词 folder_name others for kw, subfolder in keyword_map.items(): if kw.lower() in img_file.stem.lower(): folder_name subfolder break output_full output_path / folder_name / output_name5.2 方案二跳过已处理文件避免重复OCR在脚本开头添加缓存检查# 在 main() 开头加入 processed_cache set() cache_file Path(OUTPUT_FOLDER) / .processed_cache.json if cache_file.exists(): try: with open(cache_file) as f: processed_cache set(json.load(f)) except: pass # 在循环中跳过已处理的文件 if img_file.name in processed_cache: print(f⏩ 跳过已处理{img_file.name}) continue # 处理成功后更新缓存 processed_cache.add(img_file.name) with open(cache_file, w) as f: json.dump(list(processed_cache), f)5.3 方案三结果后处理自动插入元信息在save_markdown()前给每份Markdown加统一头部# 在 send_ocr_request 返回 content 后插入 header f--- title: {img_file.stem} source: {img_file.name} processed_at: {time.strftime(%Y-%m-%d %H:%M:%S)} ocr_engine: DeepSeek-OCR-2 --- content header content这样生成的文件天然支持Obsidian、Logseq等笔记软件的Front Matter解析。6. 常见问题与稳定运行建议即使脚本写得再健壮实际使用中仍可能遇到边界情况。以下是高频问题及应对方案6.1 “Connection refused” 错误原因API服务未启动或端口被占用如8000被其他程序占用。解决检查app.py是否正在运行修改API_URL http://127.0.0.1:8001/ocr并重启服务在app.py中改uvicorn.run(..., port8001)Windows用户可尝试用http://localhost:8000/ocr替代127.0.0.1。6.2 图片识别结果为空或乱码原因扫描图分辨率过低150 DPI、严重倾斜、反光或大面积黑边。解决预处理用Photoshop或免费工具如GIMP批量“去噪点自动裁边锐化”脚本增强在send_ocr_request()中加入图片预处理需额外安装opencv-python示例代码可提供。6.3 大文件夹200张运行缓慢原因单线程串行处理GPU显存未充分利用。解决启用并发用concurrent.futures.ThreadPoolExecutor替换tqdm循环注意API服务本身是否支持并发请求更优方案DeepSeek-OCR-2官方支持批量上传ZIP可改写脚本为“打包→上传ZIP→解压下载”效率提升3倍以上需服务端开启该功能。7. 总结让OCR真正成为你的数字办公流水线一环回看开头提出的三个痛点一张张上传太慢 → 本脚本5分钟处理100张网页界面无法集成 → Python API直连可嵌入Airflow、GitHub Actions、或企业微信机器人结果只是看一眼 → 自动生成标准Markdown无缝对接知识库、RAG、甚至自动生成周报。DeepSeek-OCR-2的价值从来不止于“识别文字”。它的核心竞争力在于把文档的语义结构标题层级、表格关系、段落逻辑精准编码进Markdown——而批量API调用正是释放这一能力的最短路径。你现在拥有的不再是一个网页工具而是一条静默运行的本地OCR流水线。它不打扰你却在你整理资料、归档合同、构建知识库时始终在后台高效运转。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。