

Pythonでファイル名と同じフォルダ名に格納したい

PyPDF2でPDFを分割をしました。分割処理までは出来たのですが、その先の分割したファイルを指定のフォルダに格納するやり方が分かりません。
やりたいこととして、テストフォルダ内の「１」「２「３」へのフォルダ名に  
分割したファイル名の１.pdf ,2.pdf,3.pdfのファイルをそれぞれフォルダに格納させたいです。

フォルダは先に新規で作成した状態です。

１.pdf → １のフォルダ  
２.pdf → ２のフォルダ  
３.pdf→ ３のフォルダ

開発環境はWindowsで

Pythonか、Windowsコマンドのバッチなど処理で可能でしょうか？  
もし可能ならご教示願います。

[code]

    import PyPDF2
     
    # プログラム2｜フォルダ内のPDFを全て取得
    curdir = os.getcwd()
    files = list(pathlib.Path(curdir).glob('*.pdf'))
      
    # プログラム3｜フォルダ内の全てのPDFを処理
    for file in files:
    
      merger = PyPDF2.PdfFileMerger()
      merger.append('test1.pdf', pages=(1, 9))
      merger.write('test4.pdf')
      merger.close()
    
[/code]


CC BY-SA 4.0
2022-09-28T13:11:22.990
91360
2022-09-29T05:58:18.717
2022-09-28T13:51:05.117
39819
54596
question
python windows
Pythonでファイル名と同じフォルダ名に保存がしたい


フォルダ名とファイル名を`/`または`\`のセパレータで区切って指定することで、フォルダ名とファイル名を指定できます。  
PDFのページ番号はPyPDF2の[`numPages`](https://nanonets.com/blog/pypdf2-library-
working-with-pdf-files-in-python/#extracting-document-details-with-
pypdf2)プロパティで取得できるので、例えば1ページ目は`.\1\1.pdf`など、ページ番号ごとにループして保存したいならば、下記のようなコードで実現できます

[code]

    pdf = PdfFileReader(src)
    for i in range(pdf.numPages):
        # 分割データ作成
        dest = PdfFileWriter()
        dest.addPage(pdf.getPage(i))
        with open(f"./{i+1}/{i+1}.pdf", "wb") as f:
            dest.write(f)
    
[/code]

なおフォルダ内のpdfをglobで取得していますので、ファイル名を一律で`1.pdf`のように設定すると既存の同名ファイルを上書きしてしまいます。

要件の推測を多分に含みますが、分割後のファイル名のプレフィックスに既存ファイル名を設定する(例えば `TEAMS_content_health.pdf`
の1ページ目は `TEAMS_content_health_1.pdf` になる)場合は、下記のサンプルコードのようなコーティングで対応できます。

ご質問のコードではPDFの結合をしており分割処理が見当たらない点や、`for`文の中でページ番号を記載していない点から、ご質問の意図が汲み取りにくく感じました。  
この回答が的外れな場合は、コメントの指摘事項などを質問文に追記してみてください。

**サンプルコード**

[code]

    import urllib.request
    import os
    from pathlib import Path
    from PyPDF2 import PdfFileReader, PdfFileWriter
    
    # サンプルPDFをダウンロードして取得する(※ダウンロードできない場合は代替ファイルをご用意ください)
    urls = ["https://x54cwjdqkdu7-so-docs.netlify.app/pdf/teams/b_b/general_information/TEAMS_content_health.pdf",
            "https://x54cwjdqkdu7-so-docs.netlify.app/pdf/teams/b_b/getting_started/TEAMS_ask_a_question.pdf"]
    for url in urls:
        src = url.split("/")[-1]
        urllib.request.urlretrieve(url, src)
    
    # フォルダ内のPDFをループしながら分割する
    for src in Path().glob('*.pdf'):
        # サンプルPDFのページを分割して保存する
        pdf = PdfFileReader(src)
        for i in range(pdf.numPages):
            # 分割データ作成
            dest = PdfFileWriter()
            dest.addPage(pdf.getPage(i))
            # 分割後のファイル名(例えば TEAMS_content_health.pdf の1ページ目は TEAMS_content_health_1.pdf になる)
            name = f"{Path(src).stem}_{i+1}.pdf" 
            # ページ番号に該当する数字フォルダがなければ作成
            os.makedirs(str(i+1), exist_ok=True)
            # ファイル出力(数字フォルダ内に分割後のファイル名でファイルを保存する)
            with open(f"./{i+1}/{name}.pdf", "wb") as f:
                dest.write(f)
    
[/code]

**実行結果**

[code]

    > tree /F test
    フォルダー パスの一覧:  ボリューム Windows 
    ボリューム シリアル番号は FFFF-FFFF です
    {フルパス}\TEST
    ├─1
    │      TEAMS_ask_a_question_1.pdf.pdf
    │      TEAMS_content_health_1.pdf.pdf
    │
    ├─2
    │      TEAMS_ask_a_question_2.pdf.pdf
    │      TEAMS_content_health_2.pdf.pdf
    │
    ├─3
    │      TEAMS_content_health_3.pdf.pdf
    │
    └─4
            TEAMS_content_health_4.pdf.pdf
    
[/code]


CC BY-SA 4.0
2022-09-29T05:58:18.717
91368
2022-09-29T05:58:18.717
9820
91360
answer