python - 有没有办法提高 PyPDF2.PdfFileReader 的文件读取速度。读取多个文件需要太多时间
问题描述
我有一个代码可以.pdf
通过读取 pdf 文件的内部数据来搜索文件。我的解决方案为我提供了正确的文件,但速度很慢。有没有办法让它更快?
keyword = keyword.lower()
for subdir, dirs, files in os.walk(folder_path):
for file in files:
filepath = subdir + os.sep + file
fpath = subdir + os.sep
if(keyword in file.lower()):
if filepath not in tflist:
tflist.append(os.path.join(filepath))
if filepath.endswith(".pdf"):
if filepath not in tflist:
with open(os.path.join(fpath,file), "rb") as f:
reader = PyPDF2.PdfFileReader(f)
for i in range(reader.getNumPages()):
page = reader.getPage(i)
page_content = page.extractText().lower()
if(keyword in page_content):
tflist.append(os.path.join(filepath))
break
#print (str(1+reader.getPageNumber(page)))
#print(keyword)
print(tflist)
解决方案
你可以做的是使用multiprocessing.Pool
.
将您的代码分成两部分。第一部分使用生成路径列表os.walk
。让我们称之为list_of_filenames
.
第二部分是一个函数,它读取文件并根据您的条件返回每个页面的文件名和True
/或:False
def worker(path):
rv = {}
with open(path, "rb") as f:
reader = PyPDF2.PdfFileReader(f)
for i in range(reader.getNumPages()):
page = reader.getPage(i)
page_content = page.extractText().lower()
if(keyword in page_content):
rv[i] = True
else:
rv[i] = False
return (path, rv)
像这样使用它:
import multiprocessing as mp
p = mp.Pool()
for path, rv in p.imap_unordered(worker, list_of_filenames):
print('File:', path)
print('Results:', rv)
鉴于您的 CPU 有n 个内核,这将比一次只处理一个文件快大约n倍。
推荐阅读
- symfony - 带有过滤器列表的 symfony easyadmin 表单字段类型实体
- css - 设置元素之间的空间 - 边距顶部/底部
- c# - 将浮点数保存到文本文件无法正常工作
- reactjs - 如何在 Draftjs 编辑器中修改样式?
- android - 我的 ScrollView 没有滚动 - 如何解决?
- itext - 如何将 PDFObject/PDFDictionary 转换为 PDFArray
- javascript - 第二次和第三次拖动在javascript中不起作用
- stylelint - 是否有防止块开头出现空行的规则?
- python - 在 Python 2 中获取不必要的引号
- odoo - 如何在 odoo 10.0 中重新评估已完成的库存