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

时间:2018-08-14 15:33:43

标签: python-3.x os.walk

我正在尝试使用os.walk创建每个子目录的文件列表,并执行将每个目录列表中的所有pdf合并的功能。当前脚本通过每个循环将后续目录追加到现有列表中。因此,目录1中的pdf已成功合并,但是目录2的列表包括目录1中的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)

1 个答案:

答案 0 :(得分:1)

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))