有没有一种方法可以提高PyPDF2.PdfFileReader的文件读取速度。读取多个文件需要太多时间

时间:2019-07-15 03:46:36

标签: python-3.x

我有一个代码可以通过读取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)

1 个答案:

答案 0 :(得分:1)

您可以使用multiprocessing.Pool

将您的代码分成两部分。第一部分使用os.walk生成路径列表。我们称之为list_of_filenames

第二部分是一个函数,该函数读取文件并根据您的条件为每个页面返回文件名和TrueFalse

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 倍。