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

PyPDF2读取PDF后重命名报WinError32文件被占用问题

问题原因

你遇到的WinError 32文件占用报错,根本原因是代码里用open()打开PDF文件后,没有主动关闭文件句柄,Python进程自身一直持有文件锁,和外部进程无关,所以加循环重试、条件判断逻辑都解决不了问题。
另外你的代码还存在几个会导致运行异常的隐性问题:

  • 缺少re模块导入,执行到正则替换步骤会直接抛出NameError
  • 循环内滥用global声明全局变量,不仅多余,还可能出现循环迭代时值被覆盖的异常
  • 使用的PdfFileReader是PyPDF2已废弃的旧版API,本身存在文件句柄释放不彻底的兼容问题
  • 正则逻辑写为re.sub("n", "", parsed)会删除文本中所有字母n,大概率是笔误,实际要删除的是换行符\n
修复方法

使用with上下文管理器打开文件,该语法会在代码块执行结束后自动释放文件句柄,从根源避免文件锁残留。
修复后可直接运行的完整代码:

import os
import re
from PyPDF2 import PdfReader

download_path = "C:/Users/luan.carvalho/Downloads/"
for file in os.listdir(download_path):
    if not file.endswith(".pdf"):
        continue
    old_file_full_path = os.path.join(download_path, file)
    # with块执行完毕后自动关闭文件,释放句柄
    with open(old_file_full_path, "rb") as pdf_file:
        pdf_reader = PdfReader(pdf_file)
        first_page_content = pdf_reader.pages[0].extract_text()
    # 句柄释放后再执行重命名操作,不会触发占用报错
    processed_content = re.sub(r"\n", "", first_page_content)
    new_file_name = processed_content[619:673].replace(" ", "") + ".pdf"
    new_file_full_path = os.path.join(download_path, new_file_name)
    print(f"原文件:{old_file_full_path}")
    print(f"重命名为:{new_file_name}")
    os.rename(old_file_full_path, new_file_full_path)
补充说明

如果运行修复后的代码仍偶发报错,检查是否有其他程序(PDF阅读器、浏览器PDF预览窗口、资源管理器预览窗格)正在打开目标PDF,这类外部程序持有的文件锁也会导致重命名失败,关闭对应程序即可。

内容的提问来源于stack exchange,提问作者Luan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 21:03:39