用于根据文件名和追加来循环和匹配文件的脚本

时间:2019-05-17 19:33:27

标签: python pypdf2

我有一个目录,其中包含许多文件,名称如下:

1234_part1.pdf
1234.pdf
5432_part1.pdf
5432.pdf
2323_part1.pdf
2323.pdf
etc.

我正在尝试合并pdf,其中文件的第一个数字部分相同。 我有一次可以执行此操作的代码,但是当目录中有500个以上的文件时,我不确定如何遍历,这是到目前为止的内容:

from PyPDF2 import PdfFileMerger, PdfFileReader
merger = PdfFileMerger()
merger.append(PdfFileReader(file('c:/example/1234_part1.pdf', 'rb')))
merger.append(PdfFileReader(file('c:/example/1234.pdf', 'rb')))
merger.write("c:/example/ouput/1234_combined.pdf")

理想情况下,输出文件为'xxxx_combined_<today's date>.pdf'。 即1234_combined_051719.pdf

此外,如果有一个数字文件仅包含第1部分或其他文件,则它不会合并- 也就是说,如果有9999_part1.pdf,但没有9999.pdf,则'9999_combined_<today's date>.pdf'将没有输出。

2 个答案:

答案 0 :(得分:2)

尝试使用os.listdir()获取目录中的所有文件,然后在字符串(文件名)末尾使用.split()来隔离pdf文件编号。然后在您创建的文件列表中查找该数字模式。

import os
from PyPDF2 import PdfFileMerger, PdfFileReader

dir = 'my/dir/of/pdfs/'
file_list = os.listdir(dir)
num_list = []

for fname in file_list:
    if '_' in fname:  # if the filename has an underscore in it
        file_num = fname.split('_')[0]  # get's first element in list of splits
    else:
        file_num = fname.split('.')[0]
    if file_num not in num_list:
        num_list.append(file_num)

# now you have a list of all of your file numbers you can grab all files
# in the file_list containing that number
for num in num_list:
    pdf_parts = [x for x in file_list if num in x] # grabs all files with that number
    if len(pdf_parts < 2):  # if there is only one pdf with that num ...
        continue  # skip it!
    # your pdf append operation here for each item in the pdf_parts list.
    # something like this maybe ...

    merger = PdfFileMerger()
    # sorts list by filename length in decending order so that 
    # '_part' files come first
    sorted_pdf_parts = pdf_parts.sort(key=len, reverse=True) 
    for part in sorted_pdf_parts:
        merger.append(PdfFileReader(file(dir + part, 'rb')))
    merger.write('out/dir/' + num + '_combined.pdf')

答案 1 :(得分:0)

您可以这样做:

from PyPDF2 import PdfFileMerger, PdfFileReader
from os import listdir
from datetime import datetime

file_names = listdir('D:\Code\python-examples\PDF')

for file_name in file_names:
    if "_" in file_name:
        digits = file_name.split('_')[0]
        if f'{digits}.pdf' in file_names:
            with open(f'{digits}.pdf', 'rb') as digit_file, open(f'{digits}_part1.pdf', 'rb') as part1_file:
                merger = PdfFileMerger()
                merger.append(PdfFileReader(part1_file))
                merger.append(PdfFileReader(digit_file))
                merger.write(f'{digits}_combined_{datetime.now().strftime("%m%d%y")}.pdf')

一些注意事项:

  • 建议打开文件时使用with
  • 您可以使用datetime.now().strftime("%m%d%y")来获取您提到的日期格式。

所以,如果我们有一个这样的文件夹:

initial folder

运行代码后,我们将:

done

我们可以看到它有效:

works

我还将代码以及相关文件上传到了我的GitHub page。如果有人想亲自尝试,可以尝试一下。