当前位置:   article > 正文

python找pdf的关键字段落并提高速度的办法_python 提取pdf中的段落

python 提取pdf中的段落
  1. import os
  2. import pandas as pd
  3. import PyPDF2
  4. import re
  5. from concurrent.futures import ThreadPoolExecutor
  6. import multiprocessing
  7. # 定义一个函数,用于提取PDF文件中的内容
  8. def extract_content(pdf_folder, pdf_filename, i):
  9. file_path = os.path.join(pdf_folder, pdf_filename)
  10. if os.path.exists(file_path):
  11. with open(file_path, 'rb') as f:
  12. # 使用PyPDF2库打开PDF文件,一次性读取PDF文件内容
  13. pdf_reader = PyPDF2.PdfReader(f)
  14. content = pdf_reader.read()
  15. # 在文本内容中查找conclusion段落
  16. conclusion_index = content.find('conclusion')
  17. conclusion = '' # 定义空字符串作为默认值
  18. if conclusion_index != -1:
  19. # 如果找到了conclusion段落,则根据目录页数查找对应段落
  20. directory_index = content.find('Directory')
  21. if directory_index != -1:
  22. # 从目录页数开始,查找对应页数
  23. directory_content = content[directory_index:]
  24. page_number_index = directory_content.find(str(i + 2))
  25. if page_number_index != -1:
  26. # 找到目标页数,定位到对应段落
  27. page_start_index = directory_content[page_number_index:].find('pagenum') + page_number_index
  28. page_end_index = directory_content[page_start_index:].find('\n') + page_start_index
  29. start_page_str = re.findall('\d+', directory_content[page_start_index:page_end_index])[0]
  30. start_page = int(start_page_str)
  31. end_page_index = directory_content[page_start_index:].find('\n') + page_start_index
  32. end_page_str = re.findall('\d+', directory_content[end_page_index+1:])[0]
  33. end_page = int(end_page_str)
  34. target_content = ''
  35. for j in range(start_page-1, end_page):
  36. target_content += pdf_reader.pages[j].extract_text()
  37. conclusion = target_content[target_content.find('conclusion'):]
  38. else:
  39. # 如果没有找到conclusion段落,则查找"in conclusion"的字眼段落
  40. in_conclusion_index = content.find('in conclusion')
  41. if in_conclusion_index != -1:
  42. conclusion = content[in_conclusion_index:]
  43. else:
  44. # 如果还是没有找到,则查找"summary"的字眼段落
  45. summary_index = content.find('summary')
  46. if summary_index != -1:
  47. conclusion = content[summary_index:]
  48. return conclusion
  49. # 读取原始Excel表格,获取pdf_filename列数据
  50. df = pd.read_excel(r'C:\Users\win10\Desktop\工作簿1.xlsx')
  51. pdf_filenames = df['pdf_filename']
  52. # 在原Excel表格创建新列conclusion
  53. df['conclusion'] = ''
  54. # 设置线程池的最大线程数或进程池的最大进程数
  55. max_workers = multiprocessing.cpu_count()
  56. # 定义线程池或进程池
  57. with ThreadPoolExecutor(max_workers=max_workers) as executor:
  58. # 遍历pdf文件夹中的所有文件,找到与pdf_filename对应的文件并提取conclusion段落
  59. pdf_folder = 'C:/Users/win10/Desktop/pdf_files'
  60. futures = []
  61. for i, pdf_filename in enumerate(pdf_filenames):
  62. futures.append(executor.submit(extract_content, pdf_folder, pdf_filename, i))
  63. # 将结果写入新Excel表格
  64. for i, future in enumerate(futures):
  65. df.loc[i, 'conclusion'] = future.result()
  66. # 保存修改后的Excel表格
  67. df.to_excel(r'C:\Users\win10\Desktop\工作簿1_mod.xlsx', index=False)

在每次处理 PDF 文件时,循环读取每一页并逐页提取内容会导致循环次数较多。可以考虑一次性读取整个 PDF 文件的内容,然后在内存中查找所需内容。这样只需要进行一次循环就可以完成所有内容的提取,从而减少循环次数。

具体做法是,在打开 PDF 文件后,使用 PyPDF2 库的 PdfReader 对象的 read() 方法一次性读取出整个 PDF 文件的内容,并保存在一个字符串变量中。然后再在这个字符串中查找所需内容,而不是逐页读取和查找。

  1. # 使用PyPDF2库打开PDF文件,一次性读取PDF文件内容
  2. pdf_reader = PyPDF2.PdfReader(f) 
  1. 利用多进程或者多线程并发处理:可以考虑使用Python自带的multiprocessing或者第三方库concurrent.futures等支持多进程或者多线程并发处理的工具库,将不同的任务分配给不同的线程或进程执行,可以显著提高程序的运行效率。

具体来说,如果想要利用多进程或者多线程并发处理,可以将遍历PDF文件部分的代码封装成一个函数,然后通过Pool(进程池)或者ThreadPoolExecutor(线程池)的方式来启动多个子进程或子线程。例如:

  1. from concurrent.futures import ThreadPoolExecutor
  2. import multiprocessing
  3. # 设置线程池的最大线程数或进程池的最大进程数
  4. max_workers = multiprocessing.cpu_count()
  5. # 定义线程池或进程池
  6. with ThreadPoolExecutor(max_workers=max_workers) as executor:
  7. # 遍历pdf文件夹中的所有文件,找到与pdf_filename对应的文件并提取conclusion段落
  8. pdf_folder = 'C:/Users/win10/Desktop/pdf_files'
  9. futures = []
  10. for i, pdf_filename in enumerate(pdf_filenames):
  11. futures.append(executor.submit(extract_content, pdf_folder, pdf_filename, i))
  12. # 将结果写入新Excel表格
  13. for i, future in enumerate(futures):
  14. df.loc[i, 'conclusion'] = future.result()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/319527
推荐阅读
相关标签
  

闽ICP备14008679号