我有一个目录,其中包含许多文件,名称如下:
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'
将没有输出。
答案 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")
来获取您提到的日期格式。所以,如果我们有一个这样的文件夹:
运行代码后,我们将:
我们可以看到它有效:
我还将代码以及相关文件上传到了我的GitHub page。如果有人想亲自尝试,可以尝试一下。