我有一个代码可以通过读取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)
答案 0 :(得分:1)
您可以使用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 倍。