0

0

Python Tabula 库高级用法:实现 PDF 表格的精确提取与清洗

花韻仙語

花韻仙語

发布时间:2025-09-06 09:43:22

|

797人浏览过

|

来源于php中文网

原创

Python Tabula 库高级用法:实现 PDF 表格的精确提取与清洗

本教程详细介绍了如何使用 Python 的 Tabula 库从 PDF 文件中高效、准确地提取表格数据。我们将从基础用法开始,逐步深入到利用 lattice=True 参数优化提取精度,并提供数据后处理策略以清除提取过程中可能产生的冗余列,最终实现干净、结构化的表格数据输出。

1. 介绍 Tabula-py 库

tabula-py 是 tabula-javapython 封装,一个功能强大的工具,专门用于从 pdf 文件中提取表格数据。它尤其擅长处理那些结构不规则、包含扫描图像或没有明确文本层的 pdf 中的表格。tabula-py 能够将提取的结果直接转换为 pandas dataframe 对象,这极大地简化了后续的数据清洗、分析和存储工作。

2. 基础提取与常见问题

在没有指定任何高级参数的情况下,tabula-py 会尝试通过启发式算法自动识别 PDF 中的表格结构。对于一些布局简单、数据清晰的表格,这种默认方法可能已经足够。

基础提取示例代码:

import tabula
import pandas as pd

# 请替换为你的PDF文件路径
pdf_path = "your_document.pdf"

print("--- 基础提取结果 ---")
try:
    # 使用默认参数进行提取
    # pages='all' 表示提取所有页面的表格
    # multiple_tables=True 表示尝试提取页面上的所有表格
    tables_default = tabula.read_pdf(pdf_path, pages='all', multiple_tables=True)

    for i, df in enumerate(tables_default):
        print(f"Table {i + 1} (基础提取):\n{df}\n")
except FileNotFoundError:
    print(f"错误:文件 '{pdf_path}' 未找到。请检查路径。")
except Exception as e:
    print(f"基础提取发生错误: {e}")

然而,正如在实际应用中经常遇到的,这种默认提取方式对于结构复杂、边框不完整或布局特殊的表格,往往无法完美捕捉所有细节。常见的问题包括:

  • 表格数据不完整或错位。
  • 某些行或列被错误地忽略。
  • 将非表格内容错误地识别为表格。
  • 引入额外的、不必要的空列或 Unnamed: X 列。

3. 提升提取精度:lattice=True 参数

当 PDF 中的表格具有清晰的线条(即“格子”结构,如传统电子表格)时,tabula-py 提供了一个关键参数 lattice=True 来显著提升提取精度。此参数指示 tabula 采用基于格线的识别算法,能够更准确地识别表格的边界和单元格。这对于那些看起来像传统电子表格的表格尤其有效。

立即学习Python免费学习笔记(深入)”;

使用 lattice=True 提取示例代码:

Open Voice OS
Open Voice OS

OpenVoiceOS是一个社区驱动的开源语音AI平台

下载
import tabula
import pandas as pd

pdf_path = "your_document.pdf" # 请替换为你的PDF文件路径

print("--- 使用 lattice=True 提取结果 ---")
try:
    # 启用 lattice=True 参数
    tables_lattice = tabula.read_pdf(
        pdf_path,
        pages='all',
        multiple_tables=True,
        lattice=True # 关键参数:启用格线识别模式
    )

    for i, df in enumerate(tables_lattice):
        print(f"Table {i + 1} (使用 lattice=True):\n{df}\n")
except FileNotFoundError:
    print(f"错误:文件 '{pdf_path}' 未找到。请检查路径。")
except Exception as e:
    print(f"lattice=True 提取发生错误: {e}")

通过设置 lattice=True,通常可以显著改善提取结果,使表格结构更加完整和准确。但即使如此,有时仍会引入一些不必要的“Unnamed: X”列,这些列通常是由于表格布局的细微差异或 tabula 识别上的模糊性造成的。

4. 数据后处理:移除冗余列

tabula.read_pdf 函数返回的是 Pandas DataFrame 对象的列表,这使得我们可以利用 Pandas 强大的数据清洗功能来移除提取过程中可能产生的冗余列,例如 Unnamed: X 格式的列。

识别并移除冗余列的方法:

  1. 检查列名: 遍历 DataFrame 的列名,查找包含 "Unnamed" 字符串的列。
  2. 删除列: 使用 df.drop() 方法删除这些识别出的列。
  3. 进一步清洗: 检查表格的第一行是否是真正的标题行。如果不是,可能需要将其设置为标题或删除。此外,还可以处理全为空的行。

示例代码(移除冗余列):

import tabula
import pandas as pd

pdf_path = "your_document.pdf" # 请替换为你的PDF文件路径

# 假设 tables_lattice 已经通过 lattice=True 提取
try:
    tables_lattice = tabula.read_pdf(
        pdf_path,
        pages='all',
        multiple_tables=True,
        lattice=True
    )
except Exception as e:
    print(f"提取表格时发生错误: {e}")
    exit()

cleaned_tables = []
if tables_lattice:
    print("\n--- 正在对提取的表格进行清洗 ---")
    for i, df in enumerate(tables_lattice):
        print(f"\n--- 处理表格 {i + 1} ---")
        print("原始表格前几行:\n", df.head())

        # 复制 DataFrame 以免修改原始数据
        current_df = df.copy()

        # 识别并移除包含 'Unnamed' 的列
        # 这里使用 str(col) 以防列名不是字符串类型
        cols_to_drop = [col for col in current_df.columns if 'Unnamed' in str(col)]
        if cols_to_drop:
            print(f"发现并移除冗余列: {cols_to_drop}")
            current_df = current_df.drop(columns=cols_to_drop)
        else:
            print("未发现冗余 'Unnamed' 列。")

        # 进一步清洗:处理可能的空行或非标题行
        # 示例:如果第一行所有值都是NaN(即全为空),则删除第一行
        if not current_df.empty and current_df.iloc[0].isnull().all():
            print("检测到第一行为空行,已移除。")
            current_df = current_df.iloc[1:].reset_index(drop=True)

        # 重置索引(可选,如果之前删除了行)
        current_df = current_df.reset_index(drop=True)

        cleaned_tables.append(current_df)
        print(f"清洗后表格 {i + 1} 前几行:\n", current_df.head())
else:
    print("未提取到任何表格,无需清洗。")

5. 完整示例代码

以下是一个结合了 lattice=True 提取和后续列清洗的完整脚本,旨在实现 PDF 表格的精确提取与清洗:

import tabula
import pandas as pd

# 指定你的 PDF 文件路径
pdf_path = "your_document.pdf" # <-- 请务必替换为你的PDF文件路径

# 1. 使用 lattice=True 参数进行表格提取
print("--- 正在使用 lattice=True 提取表格 ---")
try:
    # pages='all' 提取所有页面的表格
    # multiple_tables=True 尝试提取页面上的所有表格
    # lattice=True 启用基于格线的识别模式,适用于有清晰边框的表格
    extracted_tables = tabula.read_pdf(
        pdf_path,
        pages='all',
        multiple_tables=True,
        lattice=True,
        # encoding='utf-8' # 如果出现乱码,可以尝试指定编码
    )
    print(f"成功提取到 {len(extracted_tables)} 个表格。")
except FileNotFoundError:
    print(f"错误:文件 '{pdf_path}' 未找到。请检查路径。")
    exit()
except Exception as e:
    print(f"提取表格时发生错误: {e}")
    exit()

# 2. 对每个提取到的 DataFrame 进行后处理(移除冗余列)
final_cleaned_tables = []
if extracted_tables:
    print("\n--- 正在对提取的表格进行清洗 ---")
    for i, df in enumerate(extracted_tables):
        print(f"\n--- 处理表格 {i + 1} ---")
        print("原始表格前几行:\n", df.head().to_string()) # 使用 .to_string() 避免截断

        # 识别并移除包含 'Unnamed' 的列
        cols_to_drop = [col for col in df.columns if 'Unnamed' in str(col)]
        if cols_to_drop:
            print(f"发现并移除冗余列: {cols_to_drop}")
            df_cleaned = df.drop(columns=cols_to_drop)
        else:
            df_cleaned = df.copy() # 如果没有冗余列,也复制一份
            print("未发现冗余 'Unnamed' 列。")

        # 进一步清洗:检查并处理可能的空行或非数据行
        # 例如,如果第一行所有值都是NaN,则删除第一行
        if not df_cleaned.empty and df_cleaned.iloc[0].isnull().all():
            print("检测到第一行为空行,已移除。")
            df_cleaned = df_cleaned.iloc[1:].reset_index(drop=True)

        final_cleaned_tables.append(df_cleaned)
        print(f"清洗后表格 {i + 1} 前几行:\n", df_cleaned.head().to_string())
else:
    print("未提取到任何表格,无需清洗。")

# 3. 展示最终结果或保存
print("\n--- 最终清洗后的表格数据 ---")
for i, df in enumerate(final_cleaned_tables):
    print(f"\n最终表格 {i

相关专题

更多
python开发工具
python开发工具

php中文网为大家提供各种python开发工具,好的开发工具,可帮助开发者攻克编程学习中的基础障碍,理解每一行源代码在程序执行时在计算机中的过程。php中文网还为大家带来python相关课程以及相关文章等内容,供大家免费下载使用。

754

2023.06.15

python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

636

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

758

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

618

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

1262

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

547

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

577

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

707

2023.08.11

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
最新Python教程 从入门到精通
最新Python教程 从入门到精通

共4课时 | 0.7万人学习

Django 教程
Django 教程

共28课时 | 3.1万人学习

SciPy 教程
SciPy 教程

共10课时 | 1.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号