如何解决使用Python将pdf表连接到一个excel表
我正在使用tabula
是为了在接下来的pdf file中concat
全部tables
成为excel
格式的一张桌子。
这是我的代码:
from tabula import read_pdf
import pandas as pd
allin = []
for page in range(1,115):
table = read_pdf("goal.pdf",pages=page,pandas_options={'header': None})[0]
allin.append(table)
new = pd.concat(allin)
new.to_excel("out.xlsx",index=False)
我也尝试了以下方法:
from tabula import read_pdf
import pandas as pd
table = read_pdf("goal.pdf",pages='all',pandas_options={'header': None})
new = pd.concat(table,ignore_index=True)
new.to_excel("out.xlsx",index=False)
但是从页面#91
开始面临的问题开始出现,我发现excel
文件中的数据格式不正确。
我已经单独调试了页面,我不知道为什么格式错误,尤其是格式相同的情况。
from tabula import read_pdf
import pandas as pd
table = read_pdf("goal.pdf",pages='91',pandas_options={'header': None})[0]
print(table)
示例:
from tabula import read_pdf
import pandas as pd
table = read_pdf("goal.pdf",pages='90-91',index=False)
从第48行开始,您将看到区别here
您将在此处注意到将名称和地址放在一个单元格中的问题。而城市和州也可以一次通话
解决方法
我研究了源代码,它具有选项columns,您可以手动定义列边界。设置<v-text-field
label="Search"
v-model="search"
@input="handleSearch"
>
</v-text-field>
<v-treeview
ref="tree"
:items="tree"
:search="search"
:open.sync="open"
open-on-click
hoverable>
</v-treeview>
data(){
return{
search: '',open: [1],allOpened: false,lastOpen: []
} }
handleSearch: function (val) {
if (val) {
if (!this.allOpened) {
this.lastOpen = this.open;
this.allOpened = true;
this.$refs.tree.updateAll(true);
}
} else {
this.$refs.tree.updateAll(false);
this.allOpened = false;
this.open = this.lastOpen;
}
}
时,您必须使用columns
。
guess=False
使用程序tabula-java,在其文档中,我发现它需要以百分比或点(而非像素)为单位的值。因此,我使用程序inkscape来测量点的边界。
tabula-py
结果:
from tabula import read_pdf
import pandas as pd
# display all columns in dataframe
pd.set_option('display.width',None)
columns = [210,350,420,450] # boundaries in points
#columns = ['210,450'] # boundaries in points
pages = '90-92'
#pages = [90,91,92]
#pages = list(range(90,93))
#pages = 'all' # read all pages
tables = read_pdf("goal.pdf",pages=pages,pandas_options={'header': None},columns=columns,guess=False)
df = pd.concat(tables).reset_index(drop=True)
#df.rename(columns=df.iloc[0],inplace=True) # convert first row to headers
#df.drop(df.index[0],inplace=True) # remove first row with headers
# display
#for x in range(0,len(df),20):
# print(df.iloc[x:x+20])
# print('----------')
print(df.iloc[45:50])
#df.to_csv('output-pdf.csv')
#print(df[ df['State'].str.contains(' ') ])
#print(df[ df.iloc[:,3].str.contains(' ') ])
编辑:
它可能还需要选项 0 1 2 3 4
45 JARRARD,GARY 930 FORT WORTH DRIVE DENTON TX (940) 565-6548
46 JARRARD,GARY 2219 COLORADO BLVD DENTON TX (940) 380-1661
47 MASON HARRISON,RATLIFF ENTERPRISES 1815 W. UNIVERSITY DRIVE DENTON TX (940) 387-5431
48 MASON HARRISON,RATLIFF ENTERPRISES 109 N. LOOP #288 DENTON TX (940) 484-2904
49 MASON HARRISON,RATLIFF ENTERPRISES 930 FORT WORTH DRIVE DENTON TX (940) 565-6548
(以磅为单位)来跳过标题。否则,您将不得不删除首页上的第一行。
我没有检查所有行,但是可能需要对列边界进行一些更改。
编辑:
很少有行会引起问题-可能是因为area
中的文本太长了。
City
结果:
col3 = df.iloc[:,3]
print(df[ col3.str.contains(' ') ])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。