Tabula Python

2025年3月17日 | 阅读 8 分钟

简介

通常,我们使用的数据不一定是 CSV 或 JSON 格式。数据可以存储在 PDF 文件中的表格形式。最直接的情况是,我们可以将表格复制粘贴到电子表格或文本编辑器中。但也有可能 PDF 中有多个结构相似的表格。在这种情况下,我们需要单独复制粘贴每个表格,这使得工作变得繁琐。

然而,为了减少这种枯燥的工作,Python 提供了一个开源库,也称为 **tabula-py**,它允许用户单独提取多个表格。在接下来的教程中,我们将学习 tabula 及其功能。

什么是 Tabula?

Tabular 是 tabula-java 的一个基本包装器,它允许用户提取表格,并将 PDF 文件直接转换为 Data frames 或 JSON,使用 Python 编程语言。用户还可以从 PDF 中提取表格,并将其转换为 TSV、CSV 或 JSON 格式文件。

Tabula 是一个基于 图形用户界面 (GUI) 应用程序的工具;但是,**tabula-java** 是一个基于命令行用户界面 (CUI) 的工具。tabula-java 提供了 RubyRNodeJS 的绑定,但不是 Python 的。因此,开发人员引入了 **tabula-py** 的概念,它提供了 Python 绑定。

现在,让我们了解谁使用 Tabula 以及如何安装它。

谁使用 Tabula?

Tabula 是一个强大的工具,被各种规模的新闻机构用于支持调查性报道。这些**新闻机构**包括《伦敦泰晤士报》、ProPublica、《外交政策》、《纽约时报》、《民族报》(阿根廷)和《圣保罗先驱报》(明尼苏达州)。

Grassroots Organizations,如 SchoolCuts.org,也依赖 Tabula 将笨拙的文档转换为对公众友好的资源。

除了上述之外,还有来自其他背景的研究人员利用 Tabula 将他们的 PDF 报告转换为 Excel 电子表格、CSV 和 JSON 格式文件,并用于分析和数据库应用程序。

在 Python 中实现 Tabula

在简要讨论了 Tabula 之后,让我们来了解一下它在 Python 中的实现。

安装库

由于 **tabula-py** 是 Python 的一个开源库,我们将使用 **pip** 安装程序来安装该库。

导入库

安装完成后,我们可以通过简单地导入库来验证它,如下所示

如果程序返回 **导入错误**,建议重新安装该包。

**tabula-py** 库提供了多种功能,例如读取 PDF 文件、读取 PDF 文件特定页面上的表格、读取 PDF 文件同一页面上的多个表格,或者将 PDF 文件直接转换为 CSV 文件。

让我们开始阅读 PDF 文件

读取 PDF 文件

**tabula-py** 库允许用户使用名为 **read_pdf()** 的函数来读取 PDF 文件。

语法

参数

filename: **filename** 参数是我们希望从中读取数据的 PDF 文件的名称。

让我们将以下 PDF 数据表转换为 pandas Data Frame。

文件名:marksheet_table.py

页码:1

名称英文物理化学生物学总计
A86546583288
B56458055236
C34667390263
D77754634232
E74825577288
F69768246273
G53332945160
H70416723201
I80438828239
J90374571243
K98558881322
L90546737248
M87768854305
N86698266303
O67745465260
P75965367291
Q45878045257
R44664978237
S78397880275
T56547686273
U43906477274
V95886655304
W64678680297
X82564565248
Y79657054268
Z83544075252

下面是一个示例,演示如何从 pdf 中提取数据。

示例

输出

	   Name  English  Physics  Chemistry  Biology  Total
0     A       86       54         65       83    288
1     B       56       45         80       55    236
2     C       34       66         73       90    263
3     D       77       75         46       34    232
4     E       74       82         55       77    288
5     F       69       76         82       46    273
6     G       53       33         29       45    160
7     H       70       41         67       23    201
8     I       80       43         88       28    239
9     J       90       37         45       71    243
10    K       98       55         88       81    322
11    L       90       54         67       37    248
12    M       87       76         88       54    305
13    N       86       69         82       66    303
14    O       67       74         54       65    260
15    P       75       96         53       67    291
16    Q       45       87         80       45    257
17    R       44       66         49       78    237
18    S       78       39         78       80    275
19    T       56       54         77       86    273
20    U       43       90         64       77    274
21    V       95       88         66       55    304
22    W       64       67         86       80    297
23    X       82       56         45       65    248
24    Y       79       65         70       54    268
25    Z       83       54         40       75    252

说明

在上面的示例中,我们导入了所需的库,并定义了一个存储 pdf 数据文件地址的变量。然后,我们使用 **read_pdf()** 函数读取 pdf 中的数据并将其打印给用户。结果,数据表已成功读取。

注意:我们在 read_pdf() 函数中使用了 **pages** 参数来读取指定页面(s) 的数据。

让我们考虑另一个例子,打印特定页面(例如第 2 页)的表格。

示例

输出

      Name  Final Scores
0     A           288
1     B           236
2     C           263
3     D           232
4     E           288
5     F           273
6     G           160
7     H           201
8     I           239
9     J           243
3     D           232
4     E           288
5     F           273
6     G           160
7     H           201
8     I           239
9     J           243
10    K           322
11    L           248
12    M           305
13    N           303
14    O           260
15    P           291
16    Q           257
17    R           237
18    S           275
19    T           273
20    U           274
21    V           304
22    W           297
23    X           248
24    Y           268
25    Z           252

说明

在上面的示例中,我们遵循了与之前相同的过程。但是,我们将 **pages** 参数设置为 2,并打印了指定页面上的第一个表格。结果,页面 2 上索引为零的表格已成功打印。

现在,让我们了解当 PDF 数据文件的同一页面上有多个表格时会发生什么。

处理 PDF 文件同一页面上的多个表格

我们可以使用一个名为 **multiple_tables** 的附加参数来处理同一页面上的多个表格。 **multiple_tables** 参数接受一个布尔值,如果为 true,则 **read_pdf()** 函数将多个表格读取为独立的表格;如果为 false,则读取多个表格为一个单独的表格。

让我们考虑以下示例,演示如何将多个表格读取为独立的表格。

示例

输出

       Name  Final Scores
0     A           288
1     B           236
2     C           263
3     D           232
4     E           288
5     F           273
6     G           160
7     H           201
8     I           239
9     J           243
10    K           322
11    L           248
12    M           305
13    N           303
14    O           260
15    P           291
16    Q           257
17    R           237
18    S           275
19    T           273
20    U           274
21    V           304
22    W           297
23    X           248
24    Y           268
25    Z           252
  Name Position
0    K        I
1    M       II
2    V      III
3    N       IV
4    W        V

说明

在以下示例中,我们再次导入了所需的库,并定义了存储 PDF 文件地址的变量。然后,我们使用了 **read_pdf()** 函数,并包含了 **multiple_tables** 参数,将其设置为 **True**。然后,我们分别打印了 PDF 文件第 2 页上存在的多个表格。

现在,让我们考虑一个示例来理解如何将多个表格读取为一个单独的表格。

示例

输出

       Name Final Scores
0      A          288
1      B          236
2      C          263
3      D          232
4      E          288
5      F          273
6      G          160
7      H          201
8      I          239
9      J          243
10     K          322
11     L          248
12     M          305
13     N          303
14     O          260
15     P          291
9      J          243
10     K          322
11     L          248
12     M          305
13     N          303
14     O          260
15     P          291
16     Q          257
17     R          237
18     S          275
19     T          273
20     U          274
21     V          304
22     W          297
23     X          248
24     Y          268
25     Z          252
26  Name     Position
27     K            I
28     M           II
29     V          III
30     N           IV
31     W            V

说明

在以下示例中,我们将 **multiple_tables** 参数设置为 **False**。结果,页面 2 上的表格被视为一个单独的表格。

将 PDF 文件直接转换为 CSV 文件

借助 **tabula** 库中的 **convert_into()** 方法,我们可以将包含表格数据的 PDF 文件直接转换为 CSV 文件。

语法

让我们考虑以下示例,说明将 PDF 文件转换为 CSV 文件。

示例

输出

    'pages' argument isn't specified.Will extract only from page 1 by default.
    The PDF file has been converted successfully.

说明

在上面的示例中,我们再次导入了所需的库,并定义了包含 PDF 文件地址的变量。然后,我们使用 **convert_into()** 方法将 PDF 文件转换为 CSV 文件,并打印了一条成功消息。

此外,我们还可以注意到程序返回了一个声明,说明没有指定 **“pages”** 参数。因此,默认情况下将提取页面 1 上的表格。