遍历文件夹和子文件夹并合并pdf

时间:2021-07-22 02:59:14

标签: python pdf pdfmerger

我尝试创建一个脚本来循环遍历父文件夹和子文件夹,并将所有 pdf 合并为一个。下面是我目前写的代码,但我不知道如何将它们组合成一个脚本。

参考: Merge PDF files

第一个功能是遍历父文件夹下的所有子文件夹并获取每个pdf的路径列表。

import os
from PyPDF2 import PdfFileMerger

root = r"folder path"
path = os.path.join(root, "folder path")

def list_dir():
    for path,subdirs,files in os.walk(root):
        for name in files:
            if name.endswith(".pdf") or name.endswith(".ipynb"):
                print (os.path.join(path,name))

            
            

其次,我创建了一个列表,将所有路径附加到子文件夹中的 pdf 文件并合并到一个组合文件中。在这一步,我被告知:

<块引用>

TypeError: listdir: path 应该是字符串、字节、os.PathLike 或 None, 不列出

root_folder = []
root_folder.append(list_dir())
    
def pdf_merge():
    
    merger = PdfFileMerger()    
    allpdfs = [a for a in os.listdir(root_folder)]

    
    for pdf in allpdfs:
        merger.append(open(pdf,'rb'))
        
    with open("Combined.pdf","wb") as new_file:
        merger.write(new_file)

pdf_merge()

我应该在哪里修改代码,以避免错误并将两个功能结合在一起?

1 个答案:

答案 0 :(得分:0)

首先,您必须创建函数来创建包含所有文件的列表并return

def list_dir(root):
    result = []
    
    for path, dirs, files in os.walk(root):
        for name in files:
            if name.lower().endswith( (".pdf", ".ipynb") ):
                result.append(os.path.join(path, name))
                
    return result

我还使用 .lower() 来捕捉像 .PDF 这样的扩展名。

endswith() 可以将元组与所有扩展一起使用。

将外部值作为参数是很好的 - list_dir(root) 而不是 list_dir()


以后你可以用作

allpdfs = list_dir("folder path")

def pdf_merge(root):
    
    merger = PdfFileMerger()    
    allpdfs = list_dir(root)
    
    for pdf in allpdfs:
        merger.append(open(pdf, 'rb'))
        
    with open("Combined.pdf", 'wb') as new_file:
        merger.write(new_file)

pdf_merge("folder path")

编辑:

如果第一个函数也有扩展,它可能会更加通用

import os

def list_dir(root, exts=None):
    result = []
    
    for path, dirs, files in os.walk(root):
        for name in files:
            if exts and not name.lower().endswith(exts):
               continue 

            result.append(os.path.join(path, name))
                
    return result

all_files  = list_dir('folder_path')
all_pdfs   = list_dir('folder_path', '.pdf')
all_images = list_dir('folder_path', ('.png', '.jpg', '.gif'))

print(all_files)
print(all_pdfs)
print(all_images)

编辑:

对于单个扩展,您也可以这样做

improt glob

all_pdfs = glob.glob('folder_path/**/*.pdf', recursive=True)

它需要 **recursive=True 在子文件夹中搜索。