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
相关产品推荐
相关产品推荐

