我尝试创建一个脚本来循环遍历父文件夹和子文件夹,并将所有 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()
我应该在哪里修改代码,以避免错误并将两个功能结合在一起?
答案 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
在子文件夹中搜索。