Python批量重命名PDF时遇PermissionError权限错误求助
解决PDF批量重命名时的PermissionError: [WinError 32] 文件占用问题
问题描述
编写程序从PDF内容提取字符串批量重命名目录下PDF,已成功提取内容,但os.rename()触发PermissionError: [WinError 32],提示文件被其他进程占用。调整文件句柄关闭位置、将程序移至PDF目录运行后问题依旧。
第一次尝试代码
import PyPDF2 import os for file_name in os.listdir('upload_12.5.22_test'): load_pdf = open('C:/Users/Jake/Documents/upload_12.5.22_test/'+file_name,'rb') read_pdf = PyPDF2.PdfFileReader(load_pdf) page_count = read_pdf.getNumPages() data_page = read_pdf.getPage(0) page_content = data_page.extractText() page_content = page_content.replace('\n','') page_content = page_content.split('reports.') del page_content[0:1] p_c_str = ''.join(page_content) p_c_str = p_c_str.strip() p_c_str = p_c_str[:-6] p_c_str = p_c_str + " agreement" load_pdf.close() os.rename('C:/Users/Jake/Documents/upload_12.5.22_test/'+file_name, 'C:/Users/Jake/Documents/upload_12.5.22_test/'+p_c_str+".pdf")
第一次错误栈
Traceback (most recent call last): File "C:\Users\Jake\Documents\progam1.py", line 30, in <module> os.rename('C:/Users/Jake/Documents/upload_12.5.22_test/'+file_name, 'C:/Users/Jake/Documents/upload_12.5.22_test/'+p_c_str+".pdf") PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'C:/Users/Jake/Documents/upload_12.5.22_test/First M Last agreement.pdf' -> 'C:/Users/Jake/Documents/upload_12.5.22_test/First Last agreement.pdf' [Finished in 456ms]
第二次尝试代码
import PyPDF2 import os for file_name in os.listdir(): load_pdf = open(file_name,'rb') read_pdf = PyPDF2.PdfFileReader(load_pdf) page_count = read_pdf.getNumPages() data_page = read_pdf.getPage(0) page_content = data_page.extractText() page_content = page_content.replace('\n','') page_content = page_content.split('reports.') del page_content[0:1] p_c_str = ''.join(page_content) p_c_str = p_c_str.strip() p_c_str = p_c_str[:-6] p_c_str = p_c_str + " agreement" load_pdf.close() os.rename(file_name, p_c_str+".pdf")
第二次错误栈
Traceback (most recent call last): File "C:\Users\Jake\Documents\Work Projects\Python\Contract Extraction\upload_12.5.22_test\contract_extraction_testing_2.py", line 28, in <module> os.rename(file_name, p_c_str+".pdf") PermissionError: [WinError 32] The process cannot access the file because it is being used by another process: 'Alan R Diaz agreement.pdf' -> 'Alan Diaz agreement.pdf' [Finished in 205ms]
问题原因
即使手动关闭了load_pdf文件句柄,PyPDF2.PdfFileReader对象内部可能仍持有对文件的引用,导致操作系统未完全释放文件锁,从而无法重命名。另外Python的垃圾回收机制可能未及时回收这些对象,进一步延迟了文件资源的释放。
解决方案
方案1:使用with语句自动管理文件资源
with语句会在代码块结束后自动关闭文件,同时确保相关资源被及时释放,避免手动关闭可能出现的遗漏。
修正后的代码:
import PyPDF2 import os # 目标目录,可根据实际情况修改 target_dir = 'C:/Users/Jake/Documents/upload_12.5.22_test' for file_name in os.listdir(target_dir): # 只处理PDF文件 if not file_name.endswith('.pdf'): continue file_path = os.path.join(target_dir, file_name) # 使用with语句自动管理文件 with open(file_path, 'rb') as load_pdf: read_pdf = PyPDF2.PdfFileReader(load_pdf) data_page = read_pdf.getPage(0) page_content = data_page.extractText() # 内容处理逻辑不变 page_content = page_content.replace('\n','') page_content = page_content.split('reports.') del page_content[0:1] p_c_str = ''.join(page_content) p_c_str = p_c_str.strip() p_c_str = p_c_str[:-6] p_c_str = p_c_str + " agreement" # with块结束后文件已自动关闭,此时执行重命名 new_file_path = os.path.join(target_dir, f"{p_c_str}.pdf") os.rename(file_path, new_file_path)
方案2:显式清理PDF读取对象并触发垃圾回收
如果不想使用with语句,可以手动删除read_pdf对象并调用垃圾回收,确保文件资源被释放:
import PyPDF2 import os import gc target_dir = 'C:/Users/Jake/Documents/upload_12.5.22_test' for file_name in os.listdir(target_dir): if not file_name.endswith('.pdf'): continue file_path = os.path.join(target_dir, file_name) load_pdf = open(file_path, 'rb') read_pdf = PyPDF2.PdfFileReader(load_pdf) # 内容提取逻辑 data_page = read_pdf.getPage(0) page_content = data_page.extractText() page_content = page_content.replace('\n','') page_content = page_content.split('reports.') del page_content[0:1] p_c_str = ''.join(page_content) p_c_str = p_c_str.strip() p_c_str = p_c_str[:-6] p_c_str = p_c_str + " agreement" # 显式关闭文件、删除对象并触发垃圾回收 load_pdf.close() del read_pdf, data_page gc.collect() # 执行重命名 new_file_path = os.path.join(target_dir, f"{p_c_str}.pdf") os.rename(file_path, new_file_path)
额外排查点
- 确认没有其他程序(如PDF阅读器、资源管理器预览窗口)打开目标PDF文件,这些外部进程也会占用文件导致无法重命名。
- 避免在重命名时生成重复的文件名,若新文件名已存在,也可能引发异常(虽然本次错误提示是文件占用,但需额外注意)。
内容的提问来源于stack exchange,提问作者databank-zero
相关产品推荐
相关产品推荐

