MENU

[自炊] 逆順でスキャンした連番画像の名前を自動で修正する方法

本を自炊する時、スキャンする順番を間違えて連番と実際のページ数の対応が逆になってしまうこと、ありますよね。この状況のファイル名を修正するPythonスクリプトを作りました。
同じ状況となってめんどくせーーーとなっている方は是非サクッと使ってみてくださいませ。

目次

状況

スキャンしたファイル名が、3ケタの連番となっているものとします。
この例では、019.jpg ⇒ 032.jpgまでの14個の画像が生成されています。

しかし原稿をスキャンする順番を間違えてしまったので、
以下の様に 019.jpg ~ 032.jpg が本の 18 ~ 5ページ目に対応する画像となってしまいました。

019.jpg ⇒ 18ページ目

032.jpg ⇒ 5ページ目

スクリプト例

想定環境

以下の環境を想定して動作確認をしています。

  • Windows 10 (22H2)
  • Python はインストール済(Python 3.10.6)

スクリプト概要と使い方

以下のPythonスクリプトを、各種jpgファイルと同一のフォルダ内に置いて実行してください。
指定された範囲のファイル名が逆順の連番となり、新しいディレクトリにコピーされます。

以下の各種変数は適宜書き換えて使用してください。

  • start_page、end_page 変数 … ファイル名の範囲指定
    • 例)019.jpg~032.jpg のリネームを行うなら、start_page = 19、end_page = 32
  • directory_new 変数 … 出力先ディレクトリの指定
    • 例)スクリプトのあるフォルダに “output” フォルダを作成し、そこに出力
# Rename Reversed Pages
# スキャンする順番を間違えて逆順になってしまった連番ファイル名を修正してコピーするスクリプト

import os
import shutil

def rename_files(directory, directory_new):
    
    # 修正したいファイル名の番号を指定("011.jpg" など3桁の方式)
    start_page = 19
    end_page = 32
    
    for current_page in range(start_page, end_page + 1):
        old_filename = os.path.join(directory, f"{current_page:03}.jpg")
        new_filename = os.path.join(directory_new, f"{(end_page + start_page - current_page):03}.jpg")
        
        if os.path.exists(old_filename):
            shutil.copy(old_filename, new_filename)

directory = ""  # ここに入力元のディレクトリのパスを指定してください
directory_new = "output"  # ここに出力先のディレクトリのパスを指定してください

if not os.path.exists(directory_new):
    os.mkdir(directory_new)

rename_files(directory, directory_new)

スクリプト解説

実際の処理は、以下の rename_files() 関数で行います。 [start_page].jpg ~ [end_page].jpg を、directory_newで指定したフォルダに別名でコピーします。この例ではstart_page = 19、end_page = 32なので、019.jpg~032.jpg が別名でコピーされます。

def rename_files(directory, directory_new):
    
    # 修正したいファイル名の番号を指定("011.jpg" など3桁の方式)
    start_page = 19
    end_page = 32
    
    for current_page in range(start_page, end_page + 1):
        old_filename = os.path.join(directory, f"{current_page:03}.jpg")
        new_filename = os.path.join(directory_new, f"{(end_page + start_page - current_page):03}.jpg")
        
        if os.path.exists(old_filename):
            shutil.copy(old_filename, new_filename)

元ファイル名と、コピーされる際の別名は以下の部分で設定しています。

        old_filename = os.path.join(directory, f"{current_page:03}.jpg")
        new_filename = os.path.join(directory_new, f"{(end_page + start_page - current_page):03}.jpg")

例えば元ファイルが 020.jpg の場合、このファイルは(最後 – 1)ページ 目に対応する画像となります。従って「32 – (20 – 19)」 = 31、つまり「031.jpg」という名前でコピーすればよいです。

これを先の start_page、end_page に加え、元ファイルの番号をcurrent_pageとして表現すると
「end_page + start_page – current_page」となるわけです。

実行結果

出力先ディレクトリ(directory_new 変数)で指定したフォルダにファイルがコピーされます。

019.jpg ⇒ 5ページ目

032.jpg ⇒ 18ページ目

となり、019.jpg ⇒ 032.jpg が 5 ⇒ 18ページ目 と対応していることがわかります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

エンジニアの私が大好きな、ガジェット/オーディオ機器 のレビュー&自作 を中心に
日々の生活におけるお役立ち備忘録を目指します。

※Amazonのアソシエイトとして、当メディアは適格販売により収入を得ています。

コメント

コメントする

目次