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