【问题标题】:Python - Merge PDF files with same prefix using PyPDF2Python - 使用 PyPDF2 合并具有相同前缀的 PDF 文件
【发布时间】:2021-11-03 21:09:26
【问题描述】:

我有多个具有不同前缀的 PDF 文件。我想根据第三个前缀(下划线中的第三个值)合并这些 pdf 文件。我想使用 python 库 PyPDF2 来做到这一点。

例如:

0_2021_1_123.pdf
0_2021_1_1234.pdf
0_2021_1_12345.pdf
0_2021_2_123.pdf
0_2021_2_1234.pdf
0_2021_2_12345.pdf

预期结果

1_merged.pdf
2_merged.pdf

这是我尝试过的,但出现错误并且无法正常工作。非常感谢任何帮助。

from PyPDF2 import PdfFileMerger
import io
import os
files = os.listdir("C:\\test\\raw")
x=0

merger = PdfFileMerger()
for filename in files:
    print(filename.split('_')[2])
    prefix = filename.split('_')[2]
    if filename.split('_')[2] == prefix:
        merger.append(filename)
    merger.write("C:\\test\\result" + prefix + "_merged.pdf")
    merger.close()

这是错误信息

Traceback (most recent call last):
  File "C:/test2.py", line 12, in <module>
    merger.append(filename)
  File "C:\py\lib\site-packages\PyPDF2\merger.py", line 203, in append
    self.merge(len(self.pages), fileobj, bookmark, pages, import_bookmarks)
  File "C:\py\lib\site-packages\PyPDF2\merger.py", line 114, in merge
    fileobj = file(fileobj, 'rb')

FileNotFoundError: [Errno 2] 没有这样的文件或目录:'0_2021_564495_12345.pdf'

进程以退出代码 1 结束

【问题讨论】:

    标签: python python-3.x python-requests


    【解决方案1】:

    os.listdir() 只列出文件名;它不会包含目录名称。

    要获得实际添加到合并中的完整路径,您必须将根路径 os.path.join() 重新加入。

    但是,您还需要注意,您从 os.listdir() 获得的文件可能不一定按照您想要的前缀顺序,所以最好重构一些东西,以便您首先按前缀分组,然后处理每个前缀组:

    from collections import defaultdict
    
    from PyPDF2 import PdfFileMerger
    import os
    
    root_path = "C:\\test\\raw"
    result_path = "C:\\test\\result"
    
    files_by_prefix = defaultdict(list)
    for filename in os.listdir(root_path):
        prefix = filename.split("_")[2]
        files_by_prefix[prefix].append(filename)
    
    for prefix, filenames in files_by_prefix.items():
        result_name = os.path.join(result_path, prefix + "_merged.pdf")
        print(f"Merging {filenames} to {result_name} (prefix {prefix})")
        merger = PdfFileMerger()
        for filename in sorted(filenames):
            merger.append(os.path.join(root_path, filename))
        merger.write(os.path.join(result_path, f"{prefix}_merged.pdf"))
        merger.close()
    

    【讨论】:

    • 感谢AKX的快速回复。我收到了这个错误,我很想弄清楚但没有运气。任何的想法。 prefix = filename.split("_")[2] IndexError: list index out of range.
    • 你得到这个是因为某些文件名没有足够的_-分隔段。 (你可能想要if not filename.endswith("pdf"): continue 或类似的...)
    • 知道了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    相关资源
    最近更新 更多