赞
踩
with open(file_path, 'rb') as file:
with
语句确保文件在操作完成后会被正确关闭。'rb'
模式表示以二进制方式读取文件,这对于处理二进制格式的 PDF 文件是必要的。
4. 创建 PyPDF2.PdfFileReader
对象:
pdf_reader = PyPDF2.PdfFileReader(file)
这个对象用于读取 PDF 文件的内容。
5. 初始化一个空字符串 text
来存储提取的文本:
text = ""
for page_num in range(pdf_reader.numPages):
pdf_reader.numPages
属性返回 PDF 文件中的页面总数,for
循环遍历每一页。
7. 获取当前页面的文本内容:
page = pdf_reader.getPage(page_num) pdf_text = page.extract_text()
extract_text()
方法用于提取页面的文本内容。
8. 查找起始字符串和结束字符串的索引:
start_index = pdf_text.find(start_str) end_index = pdf_text.find(end_str)
if start_index != -1 and end_index != -1 and start_index < end_index: between_text = pdf_text[start_index + len(start_str):end_index] text += between_text
如果起始字符串和结束字符串都被找到,并且起始索引位于结束索引之前,则使用切片操作提取它们之间的文本。提取的文本被追加到 text
变量中。
10. 返回累积的文本:
return text
函数返回从每一页中提取的所有文本的组合。
11. 使用示例:
pdf_files = ['file1.pdf', 'file2.pdf'] start_str = "开始字符串" end_str = "结束字符串" for pdf_file in pdf_files: between_text = extract_text_between_substring(pdf_file, start_str, end_str) print(between_text)
这部分代码展示了如何使用定义的函数。它定义了一个 PDF 文件列表 pdf_files
,以及要查找的起始和结束字符串。然后,它遍历文件列表,对每个文件调用 extract_text_between_substring
函数,并打印提取的文本。
需要注意的是,extract_text()
方法可能不会总是返回准确的文本,特别是对于包含复杂布局或图形元素的 PDF 文件。此外,如果 PDF 文件是加密的或者文本被渲染为图像,这种方法可能不适用,需要使用 OCR 技术来提取文本。
import os import fnmatch def get_files_with_pattern(directory, pattern): matched_files = [] for root, dirs, files in os.walk(directory): for file in files: if fnmatch.fnmatch(file, pattern): matched_files.append(os.path.join(root, file)) return matched_files # 使用示例 directory = '/path/to/your/directory' # 替换为您的目录路径 pattern = '*中期票据募集说明书*' # 替换为您要匹配的模式 file_list = get_files_with_pattern(directory, pattern) # 打印文件列表 for file in file_list: print(file)
在这个示例中,get_files_with_pattern
函数接受两个参数:directory
是您想要搜索的目录路径,pattern
是您想要匹配的文件名模式。函数使用os.walk()
来遍历目录及其所有子目录,并通过fnmatch.fnmatch()
来检查每个文件名是否匹配给定的模式。
for page_num in range(len(pdf_reader.pages)):
page = pdf_reader.pages(page_num)
pdf_text = page.extract_text()
运行结果显示错误:TypeError: ‘_VirtualList’ object is not callable
在 PyPDF2
库中,PdfFileReader
对象的 pages
属性是一个虚拟列表,可以通过索引来访问,但它并不是一个函数,所以不能像函数那样被调用。错误提示 TypeError: '_VirtualList' object is not callable
就是因为尝试像调用函数那样调用了 pdf_reader.pages(page_num)
。
正确的方式是直接使用索引来访问 pages
虚拟列表中的每一项,而不是尝试调用它。以下是修改后的代码:
for page_num in range(len(pdf_reader.pages)):
page = pdf_reader.pages[page_num] # 正确的访问方式
pdf_text = page.extract_text()
# ... 处理文本 ...
在这个修改后的代码中,我们使用 pdf_reader.pages[page_num]
来获取第 page_num
页的内容,而不是尝试调用 pdf_reader.pages(page_num)
。这样就可以避免 TypeError
并正确地从 PDF 文件的每一页提取文本了。
运行结果如图:
截取的是目录部分,很显然不是我们需要的
代码如下:
import re def extract_text_between_second_occurrences(file_path, start_str, end_str, middle_str): # 读取文件内容 with open(file_path, 'r', encoding='utf-8') as file: text = file.read() # 找到目标字符串的所有出现位置 matches = re.finditer(re.escape(start_str) + '.*?' + re.escape(middle_str) + '.*?' + re.escape(end_str), text) # 如果找到匹配,并且至少有两次出现,则提取第二次出现的文本 for i, match in enumerate(matches): if i == 1: # 第二次出现 start_index = match.end(len(start_str)) end_index = match.start(len(start_str) + len(middle_str)) between_text = text[start_index:end_index] return between_text return "没有找到第二次出现的模式。"
start_str = "第二章"
end_str = "第三章"
middle_str = "利率风险"
for pdf_file in pdf_list:
between_text = extract_text_between_second_occurrences(pdf_file, start_str, end_str, middle_str)
print(between_text)
是编码选择错误
发现是ANSI格式,更改代码
with open(file_path, 'r', encoding='ANSI') as file:
text = file.read()
表示在尝试使用 MBCS(多字节字符集)编码读取文件时,遇到了无法映射到目标代码页的字节序列。
修改代码
# 检测文件编码
with open(file_path, 'rb') as file:
content = file.read()
result = chardet.detect(content)
encoding = result['encoding']
# 使用检测到的编码读取文件
with open(file_path, 'r', encoding=encoding) as file:
text = file.read()
仍然报错,只能选择忽略
# 用替代字符替换无法解码的字节
with open('file_path', 'r', encoding='gbk', errors='replace') as file:
content = file.read()
可是最终结果仍然是失败,可能因为re正则表达式无法匹配编码格式
import PyPDF2 def extract_text_between_second_occurrence(pdf_path, start_str, middle_str, end_str): # 初始化文本内容和出现位置列表 full_text = "" occurrence_positions = [] # 打开PDF文件 with open(pdf_path, 'rb') as pdf_file: pdf_reader = PyPDF2.PdfReader(pdf_file) # 遍历PDF的每一页并提取文本 for page_num in range(len(pdf_reader.pages)): page = pdf_reader.pages[page_num] text = page.extract_text() full_text += text # 添加到完整文本内容 position = full_text.find(start_str) # 查找起始字符串的位置 if position != -1: occurrence_positions.append(position) # 添加到出现位置列表 # 检查起始字符串是否至少出现了两次 if len(occurrence_positions) < 2: return "起始字符串出现次数不足两次。" # 找到第二次出现的起始位置和结束位置 second_start = occurrence_positions[1] first_end = occurrence_positions[0] + len(start_str) # 提取两次出现之间的文本 between_text = full_text[first_end:second_start] return between_text
运行结果为空集。可能还是编码问题
pdfminer.six
库提取PDF文本from pdfminer.high_level import extract_text def extract_text_between_second_occurrence_with_pdfminer(pdf_path, start_str, end_str): text = extract_text(pdf_path) start_positions = [m.start() for m in re.finditer(start_str, text)] end_positions = [m.start() for m in re.finditer(end_str, text)] if len(start_positions) < 2 or len(end_positions) < 2: return "起始字符串或结束字符串出现次数不足两次。" **自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。** **深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!** **因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。** [外链图片转存中...(img-argxgFbF-1712510594929)] [外链图片转存中...(img-rZTOr2Kl-1712510594930)] ![img](https://img-blog.csdnimg.cn/img_convert/46506ae54be168b93cf63939786134ca.png) ![img](https://img-blog.csdnimg.cn/img_convert/252731a671c1fb70aad5355a2c5eeff0.png) ![img](https://img-blog.csdnimg.cn/img_convert/6c361282296f86381401c05e862fe4e9.png) ![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png) **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!** **由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新** **如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)** _convert/6c361282296f86381401c05e862fe4e9.png) ![img](https://img-blog.csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png) **既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!** **由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新** **如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注Python)** <img src="https://img-community.csdnimg.cn/images/fd6ebf0d450a4dbea7428752dc7ffd34.jpg" alt="img" style="zoom:50%;" />
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。