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

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)

额外排查点

  1. 确认没有其他程序(如PDF阅读器、资源管理器预览窗口)打开目标PDF文件,这些外部进程也会占用文件导致无法重命名。
  2. 避免在重命名时生成重复的文件名,若新文件名已存在,也可能引发异常(虽然本次错误提示是文件占用,但需额外注意)。

内容的提问来源于stack exchange,提问作者databank-zero

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 23:50:27