编程语言
首页 > 编程语言> > python-基于文件名和追加来循环和匹配文件的脚本

python-基于文件名和追加来循环和匹配文件的脚本

作者:互联网

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

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_<今天的日期> .pdf”.
即1234_combined_051719.pdf

而且,如果有一个数字文件仅包含第1部分或其他文件,则它不会合并-
即,如果有9999_part1.pdf,但没有9999.pdf,则对于“ 9999_combined_<今天的日期> .pdf”将没有输出.

解决方法:

尝试使用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')

标签:pypdf2,python
来源: https://codeday.me/bug/20191210/2104628.html