Python Tabula

Python Tabula

简介

通常,我们使用的数据不一定以CSV或JSON格式提供。数据可以以表格形式存储在PDF文件中。最简单的情况是,我们可以将表格复制粘贴到电子表格或文本编辑器中。但也可能出现在同一PDF中存在多个具有相似结构的表格。对于这种情况,我们必须分别复制和粘贴每个表格,这会使工作变得繁琐。

然而,为了简化这项乏味的工作,Python提供了一个名为 tabula-py 的开源库,允许用户单独提取多个表格。在接下来的教程中,我们将了解关于tabula及其功能。

什么是Tabula

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

Tabula是一个基于图形用户界面(GUI)应用程序的工具;而 tabula-java 是一个基于命令行用户界面(CUI)的工具。tabula-java提供了Ruby、R和NodeJS的绑定,但没有为Python提供。因此,开发人员引入了 tabula-py 的概念,提供了Python绑定。

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

谁使用Tabula

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

还有一些基层组织,如SchoolCuts.org,也依赖Tabula将笨拙的文件转换为易于理解的公共资源。

除此之外,还有其他领域的研究人员利用Tabula将他们的PDF报告转换为Excel电子表格、CSV和JSON格式文件,并将其用于分析和数据库应用。

在Python中实现Tabula

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

库的安装

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

$ pip install tabula-py

导入库文件

一旦安装完成,我们可以通过以下方式来验证导入库文件的操作:

import tabula

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

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

让我们从读取一个PDF文件开始。

读取PDF文件

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

语法:

obj = tabula.read_pdf(filename, args[])

参数:

文件名: 文件名参数是要从中读取数据的pdf文件的名称。

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

文件名:marksheet_table.py

页码:1

Name English Physics Chemistry Biology Total
A 86 54 65 83 288
B 56 45 80 55 236
C 34 66 73 90 263
D 77 75 46 34 232
E 74 82 55 77 288
F 69 76 82 46 273
G 53 33 29 45 160
H 70 41 67 23 201
I 80 43 88 28 239
J 90 37 45 71 243
K 98 55 88 81 322
L 90 54 67 37 248
M 87 76 88 54 305
N 86 69 82 66 303
O 67 74 54 65 260
P 75 96 53 67 291
Q 45 87 80 45 257
R 44 66 49 78 237
S 78 39 78 80 275
T 56 54 76 86 273
U 43 90 64 77 274
V 95 88 66 55 304
W 64 67 86 80 297
X 82 56 45 65 248
Y 79 65 70 54 268
Z 83 54 40 75 252

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

示例:

# importing the library
import tabula
# address of the file
myfile = 'marksheet_table.pdf'
# using the read_pdf() function
mytable = tabula.read_pdf(myfile, pages = 1)
# printing the table
print(mytable[0])

输出:

       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 参数来从指定的页面读取数据。

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

示例(示例):

# importing the library
import tabula
# address of the file
myfile = 'marksheet_table.pdf'
# using the read_pdf() function
mytable = tabula.read_pdf(myfile, pages = 2)
# printing the table
print(mytable[0])

输出:

      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 参数接受一个布尔值,如果为真,则 read_pdf() 函数将多个表格作为独立的表格读取,如果为假,则将多个表格作为一个表格读取。

让我们来看一个示例,演示如何将多个表格作为独立的表格读取。

示例:

# importing the library
import tabula
# address of the file
myfile = 'marksheet_table.pdf'
# using the read_pdf() function
mytable = tabula.read_pdf(myfile, pages = 2, multiple_tables = True)
# printing the table
print(mytable[0])
print(mytable[1])

输出:

       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文件第二页上的多个表。

现在,让我们看一个示例来理解如何将多个表格读取为一个表格。

示例:

# importing the library
import tabula
# address of the file
myfile = 'marksheet_table.pdf'
# using the read_pdf() function
mytable = tabula.read_pdf(myfile, pages = 2, multiple_tables = False)
# printing the table
print(mytable[0])

输出:

       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文件。

语法:

tabula.convert_into("filename.pdf", "newfilename.csv", args[])

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

示例:

# importing the library
import tabula
# address of the file
myfile = 'marksheettable.pdf'
# using the read_pdf() function
tabula.convert_into(myfile, "marksheet.csv")
print("The PDF file has been converted successfully.")

\n \n 输出: \n

    '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页上的表格。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程