使用 os.walk 为每个目录创建一个文件列表

Using os.walk to create a filelist for each directory

我正在尝试使用 os.walk 创建每个子目录的文件列表,并执行一个函数来合并每个目录列表中的所有 pdf。当前脚本在每个循环中将后续目录附加到现有列表中。因此,directory1 中的 pdf 已成功合并,但是 directory2 的列表包括 directory1 等中的 pdf。我希望它刷新每个目录的文件列表。这是我目前使用的脚本:

    import PyPDF2
    import os
    import sys

    if len(sys.argv) > 1:
        SearchDirectory = sys.argv[1]
        print("I'm looking for PDF's in ", SearchDirectory)
    else:
        print("Please tell me the directory to look in")
        sys.exit()

    pdfWriter = PyPDF2.PdfFileWriter()


    for root, dirs, files in os.walk(SearchDirectory):
        dirs.sort()
        for file in files:
            files.sort()
            pdfFiles = []
            if file.endswith('.pdf') and ((os.path.basename(root)) == "frames"):
                print("Discovered this pdf: ", os.path.join(root, file))
                pdfFiles.append(os.path.join(root, file))

            if pdfFiles:
                for file in pdfFiles:
                    pdfFileObj = open(file, 'rb')
                    pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

                    for pageNum in range(0, pdfReader.numPages):
                        pageObj = pdfReader.getPage(pageNum)
                        pdfWriter.addPage(pageObj)
                        pdfOutput = open((os.path.split(os.path.realpath(root))[0]) + ".pdf", "wb")
                        pdfWriter.write(pdfOutput)
                        pdfOutput.close()

                print("The following pdf has been successfully appended:", os.path.join(root, file))
            else:
                print("No pdfs found in this directory:", root)

os.walk 循环对每个目录迭代一次。所以您想为每个目录创建一个新的 PDFWriter。

使用continue尽快跳出循环也是个好主意,这样可以保持嵌套平坦。

大写字母开头的名字是为类预留的,所以应该是searchDirectory,写成小s.

最后,利用 with 块来处理 I/O - 它们会自动为您调用 .close()

我不会为了这个问题安装PyPDF2,但是这个方法看起来很合理:

for root, dirs, files in os.walk(searchDirectory):
    if not os.path.basename(root) == "frames":
        continue

    pdfFiles = [os.path.join(root, file) for file in sorted(files)]

    if not pdfFiles:
        continue

    pdfWriter = PyPDF2.PdfFileWriter()
    outputFile = os.path.split(os.path.realpath(root))[0] + ".pdf"

    for file in pdfFiles:
        print("Discovered this pdf:", file)
        with open(file, 'rb') as pdfInput:
            pdfReader = PyPDF2.PdfFileReader(pdfInput)

            for page in pdfReader.pages:
                pdfWriter.addPage(page)

    with open(outputFile, "wb") as pdfOutput:
        pdfWriter.write(pdfOutput)

    print("%s files appended to %s" % (len(pdfFiles), outputFile))