4

複数のPDFを1つにマージして出力フォルダーに入れるPythonスクリプトを書いています。各 PDF は従業員名が記載された別のフォルダーにあり、別のフォルダー内の対応する PDF と組み合わせる必要があります。すべての従業員が各ファイルを持っているわけではないので、ロジックに含めました。

私が現在抱えている問題は、ファイルを追加するときに PdfFileMerger が文字列を期待し、pathlib ライブラリが windowpath オブジェクトを返すことです。それは簡単に文字列に変換されません。この投稿pypdf Merging multiple pdf files into one pdfから PyPDF2 に関するこの情報を取得しています。私は pathlib ライブラリを初めて使用します。変換を行う必要がありますか、それとも別のパス オブジェクトを取得する必要がありますか?

from PyPDF2 import PdfFileMerger, PdfFileReader
from pathlib import Path

tc = Path('totalcomp')
merger = PdfFileMerger()


for i in tc.iterdir():
pdfs = []
try:
    pdfs.append(Path(f'profitshare/{i.name}'))
    pdfs.append(Path(f'merit/{i.name}'))
finally:
    pdfs.append(i)
    for pdf in pdfs:
        output = i.name
        merger.append(pdf, 'rb')
    merger.write(Path(f'/output/{i.name}'))
4

1 に答える 1

3

pathlibのドキュメントによると

パスの文字列表現は、生のファイルシステム パスそのもの (ネイティブ形式、たとえば Windows ではバックスラッシュを使用) であり、ファイル パスを文字列として受け取る任意の関数に渡すことができます。

>>> p = PurePath('/etc')
>>> str(p)
'/etc'
>>> p = PureWindowsPath('c:/Program Files')
>>> str(p)
'c:\\Program Files'

Path()したがって、解決策はオブジェクトをstr()関数でラップすることです:

from PyPDF2 import PdfFileMerger, PdfFileReader
from pathlib import Path

tc = Path('totalcomp')
merger = PdfFileMerger()


for i in tc.iterdir():
pdfs = []
try:
    pdfs.append(str(Path(f'profitshare/{i.name}')))
    pdfs.append(str(Path(f'merit/{i.name}')))
finally:
    pdfs.append(i)
    for pdf in pdfs:
        output = i.name
        merger.append(pdf, 'rb')
    merger.write(str(Path(f'/output/{i.name}')))

ところで、パスを文字列として返すもう 1 つの pathlib のメソッドがあります。as_posix()

スラッシュ (/) を含むパスの文字列表現を返します。

>>>
>>> p = PureWindowsPath('c:\\windows')
>>> str(p)
'c:\\windows'
>>> p.as_posix()
'c:/windows'
于 2020-05-06T16:08:18.273 に答える