无法加密最内层文件夹中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
相关产品推荐
相关产品推荐

