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

无法加密最内层文件夹中PDF文件的技术问题求助

问题排查与解决方法

先来看你的代码里导致深层目录(比如sub_inner_folder)文件未被加密的几个核心问题:

1. os.walk的使用逻辑完全错误

os.walk本身会递归遍历目标目录下的所有子目录和文件,但你的代码却额外遍历subfolders,还调用os.chdir(folder)切换目录,这会导致路径混乱——当遍历到深层目录时,os.listdir()读取的并不是当前os.walk指向的目录,而是你切换后的上层目录,自然找不到深层的PDF文件。

2. 变量名重复覆盖

你在for folder, subfolders, files in os.walk(...)中已经定义了files(当前目录的文件列表),但后面又写了for files in os.listdir(),这里的files会覆盖之前的变量,导致循环逻辑彻底混乱。

3. 错误的break语句

当遇到一个已加密的PDF时,你用break跳出了整个文件循环,这会导致同一目录下后续的未加密PDF也无法被处理,应该用continue跳过当前已加密的文件即可。

4. 只加密PDF的第一页

你的代码只添加了PDF的第一页到加密文件中,这是功能缺陷,应该遍历所有页面添加进去。


修正后的代码

import os
import sys
import PyPDF2

def encrypt_Files():  # 修正拼写错误:encypt → encrypt
    target_root = '/home/username/Desktop/folder'
    for folder, _, files in os.walk(target_root):  # 不需要处理subfolders,os.walk会自动递归
        for file_name in files:  # 用file_name代替重复的files变量
            if file_name.endswith('.pdf'):
                file_path = os.path.join(folder, file_name)  # 用绝对路径,避免切换目录的问题
                try:
                    with open(file_path, 'rb') as pdf_file:
                        pdf_reader = PyPDF2.PdfReader(pdf_file)  # 注意:PyPDF2 v2.0+ 用PdfReader代替PdfFileReader
                        if pdf_reader.is_encrypted:
                            print(f"跳过已加密文件:{file_path}")
                            continue  # 跳过当前文件,继续处理下一个
                        
                        pdf_writer = PyPDF2.PdfWriter()  # v2.0+ 用PdfWriter代替PdfFileWriter
                        # 添加所有页面到writer
                        for page in pdf_reader.pages:
                            pdf_writer.add_page(page)
                        
                        # 设置密码并保存加密后的文件
                        encrypted_file_name = f"{os.path.splitext(file_name)[0]}_encrypted.pdf"
                        encrypted_file_path = os.path.join(folder, encrypted_file_name)
                        with open(encrypted_file_path, 'wb') as encrypted_file:
                            pdf_writer.encrypt(sys.argv[1])
                            pdf_writer.write(encrypted_file)
                        
                        print(f"已加密:{encrypted_file_path}")
                except Exception as e:
                    print(f"处理文件{file_path}时出错:{str(e)}")

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("请提供加密密码作为命令行参数")
        sys.exit(1)
    encrypt_Files()

关键改进说明

  • 使用绝对路径:通过os.path.join(folder, file_name)构建文件的绝对路径,彻底避免切换目录带来的路径混乱问题,确保无论深层还是浅层目录的文件都能被正确找到。
  • 正确利用os.walk:直接遍历os.walk返回的files列表,不需要手动处理子目录,os.walk会自动递归遍历所有层级的目录。
  • 修复变量名冲突:用file_name代替重复的files变量,避免覆盖。
  • 处理所有PDF页面:遍历pdf_reader.pages添加所有页面,保证加密后的PDF完整。
  • 异常处理:添加try-except块捕获可能的错误(比如损坏的PDF文件),避免程序中途崩溃。
  • 适配PyPDF2新版本:PyPDF2 v2.0+ 已经废弃了PdfFileReader和PdfFileWriter,改用PdfReader和PdfWriter,如果你的版本较旧,可以改回旧类名,但建议升级到最新版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:37:38