无法加密最内部的文件

2024-06-26 12:36:59 发布

您现在位置:Python中文网/ 问答频道 /正文

文件夹结构:

                       Folder
                        /  \
                       /    \
                subfolder1   files
                    /\         
                   /  \         
    inner_subfolder1   files
                /\
               /  \
sub_inner_folder   files
            /
        files

这里的问题是sub_inner_folder中的文件未加密

def encypt_Files():
    for folder, subfolders, files in os.walk('/home/username/Desktop/folder'):

        for subfolder in subfolders:
            
            os.chdir(folder)
            
            for files in os.listdir():
                
                if files.endswith('.pdf'):
                    
                    PdfReaderobj = PyPDF2.PdfFileReader(open(files, 'rb'))
                    PdfWriterobj = PyPDF2.PdfFileWriter()
                    if PdfReaderobj.isEncrypted:
                        break
                    else:
                        PdfWriterobj.addPage(PdfReaderobj.getPage(0))
                        PdfWriterobj.encrypt(sys.argv[1])
                        
                        resultPdf = open(files.strip('.pdf')+'_encrypted.pdf', 'wb')
                        PdfWriterobj.write(resultPdf)
                        resultPdf.close()

Tags: inforifpdfosfilesopenfolder
3条回答

foldername=[]#用于存储文件夹路径

对于os.walk(路径)中的文件夹、子文件夹和文件: foldername.append(文件夹)#在列表中存储文件夹路径

对于foldername中的文件路径:

os.chdir(file_path)  # changing directory path from stored folder paths

for files in os.listdir():
    
    if files.endswith('.pdf'):
        pdfReaderobj=PyPDF2.PdfFileReader(open(files,'rb'))
        pdfWriterobj=PyPDF2.PdfFileWriter()
        
        
        if pdfReaderobj.isEncrypted:
            continue
        else:
            pdfWriterobj.addPage(pdfReaderobj.getPage(0))
            pdfWriterobj.encrypt(sys.argv[1])
            
            resultPdf=open(files.strip('.pdf')+'_encrypted.pdf','wb')
            pdfWriterobj.write(resultPdf)
            resultPdf.close()

我看到的一个问题是,在查找加密文件时break超出了内部for循环。这可能是一个continue,但是您使用files创建一个新的迭代器表明您可能需要重新考虑整个策略

另一个问题是,您正在chdir指向一个相对路径,该路径可能不再是相对于您所在的位置的。我建议改用os.path.join

哦,你正在{}转向{},而不是预期的{}

我建议你重新开始。使用os.walk提供的files迭代器,并使用os.path.join列出目录结构中每个文件的完整路径。然后使用每个文件的完整路径添加pdf加密代码,并删除chdir

probem here is files in sub_inner_folder are not encrypted.

您需要os.chdir(folder)其中应该是os.chdir(subfolder)。此外,在使用完该目录后,还需要使用os.chdir("..")将该目录更改回原来的目录

如果您从错误的工作目录开始,您将无法chdir()任何地方。所以你首先需要一个os.chdir("/home/username/Desktop/folder")

此外,权限可能会中断循环。加

except FileNotFoundError:
    pass  # or whatever
except PermissionError:
    pass  # or whatever

但是:os.walk()已经为您提供了一个文件列表。你只需要把这些循环一下。这样你也可以摆脱os.listdir()

还有一个对我来说完全合理的选择:

import glob
for result in glob.iglob('/home/username/Desktop/folder/**/*.pdf'):
    print(result)

相关问题 更多 >