-1

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

参考: 合并 PDF 文件

第一个功能是遍历父文件夹下的所有子文件夹并获取每个 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 文件并合并到一个组合文件中。在这一步,我被告知:

类型错误:listdir:路径应该是字符串、字节、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()

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

4

1 回答 1

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搜索。

于 2021-07-22T05:22:18.387 回答