Python教程-Tabula Python
介绍
通常情况下,我们使用的数据不一定是以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
姓名 | 英语 | 物理 | 化学 | 生物 | 总分 |
---|---|---|---|---|---|
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参数来从指定的页面(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中提取表格。