介绍

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

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

什么是Tabula?

Tabula是tabula-java的基本包装器,它允许用户提取表格并将PDF文件直接转换为数据框(DataFrames)或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和明尼苏达州的St. Paul Pioneer Press等新闻机构

还有一些草根组织,比如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[])

参数:

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

让我们将以下PDF数据表格转换为pandas数据框。

文件名: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中提取数据。

示例:

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

让我们考虑另一个示例,打印来自特定页面(例如第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文件第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, 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.")  

输出:

  '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中提取表格。

标签: Tkinter教程, Tkinter安装, Tkinter库, Tkinter入门, Tkinter学习, Tkinter入门教程, Tkinter, Tkinter进阶, Tkinter指南, Tkinter学习指南, Tkinter进阶教程, Tkinter编程