PyPDF2代码报错'_VirtualList' object is not callable,需将PDF文本导入Excel列
问题:提取PDF文本到Excel时触发TypeError: '_VirtualList' object is not callable
需求
将指定文件夹中的PDF文件文本提取到Excel表格的对应列中(每个PDF对应一列,每页文本对应该行)。
原代码
import os from openpyxl import Workbook from PyPDF2 import PdfReader input_folder = r"C:\Users\91620\OneDrive\Desktop\Final Year Project\case laws (2)\New folder (2)" output_file = r"C:\Users\91620\OneDrive\Desktop\Final Year Project\sentemental.xlsx" wb = Workbook() ws = wb.active for i, filename in enumerate(os.listdir(input_folder)): if filename.endswith(".pdf"): filepath = os.path.join(input_folder, filename) with open(filepath, "rb") as f: pdf = PdfReader(f) readerpdf=len(pdf.pages()) for page in range(readerpdf): text = pdf.getPage(page).extractText() ws.cell(row=page+1, column=i+1).value = text wb.save(output_file)
错误信息
TypeError Traceback (most recent call last) Cell In [9], line 16 14 with open(filepath, "rb") as f: 15 pdf = PdfReader(f) ---> 16 readerpdf=len(pdf.pages()) 17 for page in range(readerpdf): 18 text = pdf.getPage(page).extractText() TypeError: '_VirtualList' object is not callable
错误原因
pdf.pages是属性而非方法:你错误地给pages加了括号(),它是PyPDF2中存储PDF页面的列表式属性,直接访问即可,不需要调用。- API版本差异:PyPDF2的新版本中,
getPage()方法已被废弃,改用pdf.pages[page_index]来访问指定页面。
修正后的代码
import os from openpyxl import Workbook from PyPDF2 import PdfReader input_folder = r"C:\Users\91620\OneDrive\Desktop\Final Year Project\case laws (2)\New folder (2)" output_file = r"C:\Users\91620\OneDrive\Desktop\Final Year Project\sentemental.xlsx" wb = Workbook() ws = wb.active for col_idx, filename in enumerate(os.listdir(input_folder), start=1): if filename.endswith(".pdf"): filepath = os.path.join(input_folder, filename) with open(filepath, "rb") as f: pdf = PdfReader(f) # 直接访问pages属性获取长度,无需调用 total_pages = len(pdf.pages) for row_idx in range(total_pages): # 用pages[索引]替代废弃的getPage方法 page = pdf.pages[row_idx] text = page.extract_text() # 行从1开始,列对应当前PDF的索引 ws.cell(row=row_idx+1, column=col_idx).value = text wb.save(output_file)
额外说明
- 修正了循环变量命名(
col_idx/row_idx),提升代码可读性 - 改用
enumerate(..., start=1)直接从1开始计数列索引,避免后续i+1的冗余计算 - 使用
extract_text()替代旧版的extractText()(新版本PyPDF2中两者兼容,但前者更符合PEP8命名规范)
内容的提问来源于stack exchange,提问作者Nayan Prakash Lal
相关产品推荐
相关产品推荐

