You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

错误原因

  1. pdf.pages是属性而非方法:你错误地给pages加了括号(),它是PyPDF2中存储PDF页面的列表式属性,直接访问即可,不需要调用。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 22:33:35