如何使用python从文件夹中的PDF中提取文本并将其保存在dataframe中?

如何使用python从文件夹中的PDF中提取文本并将其保存在dataframe中?,python,dataframe,pdf,apache-tika,pdf-conversion,Python,Dataframe,Pdf,Apache Tika,Pdf Conversion,我有很多文件夹,每个文件夹都有几个pdf文件(还有其他文件类型,如.xlsx或.doc)。我的目标是提取每个文件夹的pdf文本,并创建一个数据框,其中每个记录都是“文件夹名称”,每列以字符串形式表示该文件夹中每个pdf文件的文本内容 我用tikapackage(代码如下)从一个pdf文件中提取文本。但不能循环在文件夹或其他文件夹中的其他PDF上进行迭代,以构造结构化数据帧 #从tike导入解析器对象 从tika导入解析器 #打开pdf文件 parsed_pdf=parser.from_文件(“

我有很多文件夹,每个文件夹都有几个pdf文件(还有其他文件类型,如.xlsx或.doc)。我的目标是提取每个文件夹的pdf文本,并创建一个数据框,其中每个记录都是“文件夹名称”,每列以字符串形式表示该文件夹中每个pdf文件的文本内容

我用
tika
package(代码如下)从一个pdf文件中提取文本。但不能循环在文件夹或其他文件夹中的其他PDF上进行迭代,以构造结构化数据帧

#从tike导入解析器对象
从tika导入解析器
#打开pdf文件
parsed_pdf=parser.from_文件(“ducument_1.pdf”)
#保存pdf的内容
#您也可以通过解析的pdf['text']仅携带文本
#已解析的pdf['content']返回字符串
数据=已解析的pdf['content']
#内容的印刷
打印(数据)
#  

打印(键入(数据))
非常容易在unix上获得所有PDF的列表

import os

# saves all pdf in a string.
a = os.popen("du -a|awk '{print $2}'|grep '.*\.pdf$'").read()[2:-1]
print(a)
在我的计算机上,输出为:

[luca@artix tmp]$ python3 forum.py
a.pdf
./foo/test.pdf
你可以这样做

for line in a.split('\n'):
    print(line, line.split('/'))

你会知道pdf的文件夹。我希望我能帮助您

非常容易地获得unix上所有PDF的列表

import os

# saves all pdf in a string.
a = os.popen("du -a|awk '{print $2}'|grep '.*\.pdf$'").read()[2:-1]
print(a)
在我的计算机上,输出为:

[luca@artix tmp]$ python3 forum.py
a.pdf
./foo/test.pdf
你可以这样做

for line in a.split('\n'):
    print(line, line.split('/'))

你会知道pdf的文件夹。我希望我能帮助您

如果您想查找目录及其子目录中的所有PDF,可以使用
os.listdir
glob
,请参阅。我选择了稍微长一点的形式,这样对于初学者来说更容易理解正在发生的事情

然后,对于每个文件,调用ApacheTika,并保存到数据帧中的下一行

#!/usr/bin/python3

import os, glob
from tika import parser 
from pandas import DataFrame

# What file extension to find, and where to look from
ext = "*.pdf"
PATH = "."

# Find all the files with that extension
files = []
for dirpath, dirnames, filenames in os.walk(PATH):
    files += glob.glob(os.path.join(dirpath, ext))

# Create a Pandas Dataframe to hold the filenames and the text
df = DataFrame(columns=("filename","text"))

# Process each file in turn, parsing with Tika and storing in the dataframe
for idx, filename in enumerate(files):
   data = parser.from_file(filename)
   text = data["content"]
   df.loc[idx] = [filename, text]

# For debugging, print what we found
print(df)

如果要查找目录及其子目录中的所有PDF,可以使用
os.listdir
glob
,请参阅。我选择了稍微长一点的形式,这样对于初学者来说更容易理解正在发生的事情

然后,对于每个文件,调用ApacheTika,并保存到数据帧中的下一行

#!/usr/bin/python3

import os, glob
from tika import parser 
from pandas import DataFrame

# What file extension to find, and where to look from
ext = "*.pdf"
PATH = "."

# Find all the files with that extension
files = []
for dirpath, dirnames, filenames in os.walk(PATH):
    files += glob.glob(os.path.join(dirpath, ext))

# Create a Pandas Dataframe to hold the filenames and the text
df = DataFrame(columns=("filename","text"))

# Process each file in turn, parsing with Tika and storing in the dataframe
for idx, filename in enumerate(files):
   data = parser.from_file(filename)
   text = data["content"]
   df.loc[idx] = [filename, text]

# For debugging, print what we found
print(df)

du
grep
似乎有些过激,而且不太便于携带。。。为什么不使用类似的东西呢?你可以很容易地在python中创建du脚本和python中的grep脚本。如果你在windows上运行,因为du、grep和awk都是用C编写的,所以非常便于移植,只需在文件夹中包含du.exe、grep.exe、awk.exe即可。如果确实需要unix工具,那么像
find
ls
这样的工具会简单得多。但是,python内置了对列出目录的支持,因此您需要解释为什么需要外部工具以及为什么内置支持不能使用,因为内置支持可以更好、更可移植。所以请写下你自己的答案,
du
grep
似乎是一种过激的行为,而且不太便于携带。。。为什么不使用类似的东西呢?你可以很容易地在python中创建du脚本和python中的grep脚本。如果你在windows上运行,因为du、grep和awk都是用C编写的,所以非常便于移植,只需在文件夹中包含du.exe、grep.exe、awk.exe即可。如果确实需要unix工具,那么像
find
ls
这样的工具会简单得多。但是,python内置了对列出目录的支持,因此您需要解释为什么需要外部工具以及为什么内置支持不能使用,因为内置支持可以更好、更可移植。因此,请写下你自己的答案。这很好地完成了工作!如果包含其他文件格式(.doc),是否可以相应调整此功能->ext=“*.pdf”?是的,只需定义两个扩展名,然后为两个扩展名重复glob+保存匹配文件步骤。这项工作做得很好!如果包含其他文件格式(.doc),是否可以相应调整此功能->ext=“*.pdf”?是的,只需定义两个扩展名,然后对这两个扩展名重复glob+保存匹配文件步骤