如何在Python中返回多份PDF提取的全部文本?代码调试求助
如何让Python PDF提取函数返回文本而非仅打印?
我写了如下Python代码,目前它能将目标文件夹中所有PDF的内容存入pages变量并可打印,但无法返回提取到的文本。我通过在该文件夹放入随机PDF测试,请问如何让它像打印那样返回提取的文本?
我的代码:
import os import PyPDF2 as pdf import pandas as pd def scan_files(root): for path, subdirs, files in os.walk(root): for name in files: if name.endswith('.pdf'): #print(name) pdf = PyPDF2.PdfFileReader(os.path.join(path,name)) numPages = pdf.getNumPages() for p in range(0, numPages): pages = '' page = pdf.getPage(p) pages += page.extractText() pages = pages.replace('\n', '') #print(pages) return pages
问题分析与修正方案
我看了你的代码,发现几个关键问题导致无法正确返回提取的文本:
pages变量初始化位置错误:你在每页循环里都把pages重置为空字符串,这意味着每次只会保留当前页的文本,前面的内容都会被覆盖。- 命名冲突:你先用
import PyPDF2 as pdf给库起了别名,后面又把pdf赋值为PdfFileReader的实例,这会覆盖原来的库别名,后续如果再调用PyPDF2的其他功能会报错。 - 返回逻辑有漏洞:如果目标文件夹里没有PDF文件,
pages变量根本没被定义,执行return pages会直接报错。
下面是修正后的代码,它会完整收集所有PDF的所有页面文本,并正确返回:
import os import PyPDF2 import pandas as pd def scan_files(root): # 在外层初始化空字符串,用来累积所有PDF的文本 pages = '' for path, subdirs, files in os.walk(root): for name in files: if name.endswith('.pdf'): # 用新变量名避免覆盖库别名 pdf_reader = PyPDF2.PdfFileReader(os.path.join(path, name)) num_pages = pdf_reader.getNumPages() for p in range(num_pages): page = pdf_reader.getPage(p) # 提取当前页文本并移除换行符,追加到总文本中 page_text = page.extractText().replace('\n', '') pages += page_text # 要是需要区分不同页面,可以在这里加个分隔符,比如pages += '\n---\n' return pages
修正说明:
- 把
pages的初始化移到了所有循环外面,确保能持续累积所有页面的文本。 - 将
pdf变量改名为pdf_reader,彻底避免和PyPDF2库的命名冲突。 - 每页提取的文本直接追加到总
pages里,不再重置变量,保证所有内容都被保留。 - 就算文件夹里没有PDF,
pages也会以空字符串的形式返回,不会触发报错。
你可以这样测试这个函数:
# 替换成你的目标文件夹路径 extracted_text = scan_files('/path/to/your/pdf/folder') print(extracted_text) # 还能把提取的文本保存到本地文件 with open('all_pdf_content.txt', 'w', encoding='utf-8') as f: f.write(extracted_text)
内容的提问来源于stack exchange,提问作者Swechha Ghimire
相关产品推荐
相关产品推荐

