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