使用 python 中的 pyPDF2 模块递归合并子文件夹中的 pdf

Recursively merge pdf's in subfolders using the pyPDF2 module in python

我是一名开发新手,正在学习 python 并且我正在尝试递归解析包含多个 pdf 的文件夹和子文件夹,并根据子文件夹名称将它们合并为一个 pdf。 我有以下文件夹和子文件夹结构

合并前的文件夹

dummy
           ball
               ball_baseball.pdf
               ball_basketball.pdf
               ball_volleyball.pdf
          ice
               ice_skating.pdf
               ice_curling.pdf
               ice_hockey.pdf

id希望看到的理想结果是

       dummy
           ball
               ball.pdf(containing 3 sheets)
           ice
               ice.pdf (containing 3 sheets)

之前使用 pandas 回答了 csv 文件的问题字符串。但我使用 PyPDf 合并 pdf'f 这是我到目前为止尝试过的代码。 它似乎有效,但我可能搞砸了 for 循环,因此在子文件夹中递归地附加和合并 pdf

import sys, os,PyPDf2
from PyPDF2 import PdfFileMerger, PdfFileReader
dirs=r"path to the folder directory"
for root,dirs,files in os.walk(dirs):
    merger = PdfFileMerger()
    for filename in files:
        if filename.endswith(".pdf"):
            filepath = os.path.join(root, filename)
            merger.append(PdfFileReader(open(filepath, 'rb')))
            merger.write(str(filename))`

任何建议将不胜感激 提前致谢

如果您想要将合并的文件写入包含您的 python 脚本的文件夹而不是子文件夹,您需要进行一些调整:

import sys, os,PyPDf2

from PyPDF2 import PdfFileMerger, PdfFileReader
hdir=r #path to the folder directory; would suggest using os.getcwd()
for root,dirs,files in os.walk(hdir):
#changed so that directories thrown by os.walk are not the same as start
    merger = PdfFileMerger()
    for dir in dirs:
        for filename in files:
            if filename.endswith(".pdf"):
                filepath = os.path.join(root, filename)
                merger.append(PdfFileReader(open(filepath, 'rb')))
                #merger.write(str(filename))
        merger.write(os.path.join(hdir,dir+'.pdf'))
        #writes to the main directory, names the merged file after the subdirectory

我想出了如何 运行 它们循环

rootDir=r"path to your directory"
for dirName,subDir, fileList in os.walk(rootDir, topdown=False):
    merger = PdfFileMerger()
    for fname in fileList:
        merger.append(PdfFileReader(open(os.path.join(dirName, fname),'rb')))
merger.write(str(dirName)+".pdf")

将 merger=PdfMerger() 带入循环中就成功了!!

我知道这是一个很老的问题,但我自己也遇到过同样的问题。我尝试了 C. Taylor 的解决方案,但最终出现了一些错误。无论如何,以下代码对我有用。

import sys, os,PyPDf2
from PyPDF2 import PdfFileMerger, PdfFileReader
print("testing ")

hdir=os.getcwd()
for root,dirs,files in os.walk(hdir):
    merger = PdfFileMerger()    
    for filename in files:
        if filename.endswith(".pdf"):
            print(filename)
            filepath = os.path.join(root, filename)
            merger.append(PdfFileReader(open(filepath, 'rb')))
    merger.write(os.path.join(hdir,os.path.basename(os.path.normpath(root))+'.pdf'))

合并后的 PDF 有其文件夹的名称,并且已写入主目录。