You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Excel表格截图转换为pandas DataFrame?求Python实现方案

把表格截图转成Pandas DataFrame的Python OCR方案

所需工具

你需要安装几个Python库,以及Tesseract OCR引擎:

  • 安装Python库:
    pip install pytesseract opencv-python pandas pillow
    
  • 安装Tesseract引擎:
    • Windows:下载官方安装包,安装后需将Tesseract路径(比如C:\Program Files\Tesseract-OCR\tesseract.exe)添加到系统环境变量,或在代码里指定pytesseract.pytesseract.tesseract_cmd = r'你的路径'
    • Mac:brew install tesseract
    • Linux:sudo apt install tesseract-ocr

完整实现步骤

1. 图片预处理(提升OCR准确率)

表格截图常存在光照不均、噪声问题,预处理能大幅提高识别精度:

import cv2
import pytesseract
import pandas as pd
import re

def preprocess_image(image_path):
    # 读取图片
    img = cv2.imread(image_path)
    # 转灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # 自适应二值化,处理光照不均
    thresh = cv2.adaptiveThreshold(
        gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2
    )
    # 去除小噪声
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (2,2))
    cleaned = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel, iterations=1)
    return cleaned

2. 提取表格文本并转换为DataFrame

# 预处理目标图片
processed_img = preprocess_image("your_table.jpg")

# 配置Tesseract参数:--oem 3用默认引擎,--psm 6适配规整表格(单一文本块)
custom_config = r'--oem 3 --psm 6'
table_text = pytesseract.image_to_string(processed_img, config=custom_config)

# 分割文本为行,过滤空行
lines = [line.strip() for line in table_text.split('\n') if line.strip()]

# 分割每行的列:用正则匹配2个以上空格作为分隔符(适配多数表格的空格分隔)
table_data = [re.split(r'\s{2,}', line) for line in lines]

# 转换为DataFrame(假设第一行是表头)
df = pd.DataFrame(table_data[1:], columns=table_data[0])
print(df)

进阶优化(处理复杂表格)

如果表格是竖线分隔、布局不规整,用image_to_data获取字符位置信息,按列分组更准确:

# 获取带位置的OCR结果
ocr_data = pytesseract.image_to_data(processed_img, output_type=pytesseract.Output.DATAFRAME)
# 过滤无效识别行
ocr_data = ocr_data[ocr_data['conf'] != -1]

# 按x坐标分组(近似列位置),合并同一列文本
ocr_data['col'] = pd.cut(ocr_data['left'], bins=10, labels=False)  # 可根据表格列数调整bins
grouped = ocr_data.groupby(['top', 'col'])['text'].apply(' '.join).unstack()

# 清理空值,生成最终DataFrame
df = grouped.dropna(how='all').reset_index(drop=True)
df.columns = df.iloc[0]  # 第一行设为表头
df = df[1:]
print(df)

注意事项

  • 调整--psm参数:复杂布局尝试--psm 11(自动检测文本布局)或--psm 12(稀疏文本)
  • 提升准确率:可尝试放大图片(cv2.resize)、增强对比度,或用形态学操作强化表格线条
  • 多语言支持:中文表格需安装Tesseract中文语言包,添加lang='chi_sim'参数到image_to_string

内容的提问来源于stack exchange,提问作者Zatara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 22:32:31