2022/06/06(月) [n年前の日記]
#1 [python] ファイルサイズでソートしてリネームするPythonスクリプトを作成
複数の画像ファイルに対して、手作業でリネームしていく作業が面倒臭くなってきたので、自動化すべくPythonスクリプトを書いた。hoge_1920x1080_[0-9]_*.jpg というファイル群に対し、ファイルサイズを元にしてリネームしていくスクリプト。以下のような感じでリネームする。
動作確認環境は、Windows10 x64 21H2 + Python 3.9.13 64bit。
まあ、自分しか使わない・使えないスクリプトだけど、その手の処理の参考事例になりそうな気もするし、一応メモ。
_sortrename.py
python sortrename.py PATH0 PATH1 PATH2
hoge_1920x1080_2_.jpg -> hoge_1920x1080_2.jpg hoge_1920x1080_2.jpg -> hoge_1920x1080_3.jpg hoge_1920x1080_3.jpg -> hoge_1920x1080_4.jpg
動作確認環境は、Windows10 x64 21H2 + Python 3.9.13 64bit。
まあ、自分しか使わない・使えないスクリプトだけど、その手の処理の参考事例になりそうな気もするし、一応メモ。
_sortrename.py
import sys import os import re def main(): renamelist = [] cnt = len(sys.argv) if cnt <= 2: print("Error : Please select two or more files.") else: lst = [] for i in range(1, cnt): path = sys.argv[i] size = os.path.getsize(path) lst.append([path, size]) slist = sorted(lst, key=lambda x: x[1]) count = len(slist) + 1 for v in slist: path, size = v dirname = os.path.dirname(path) filename = os.path.basename(path) newfile = re.sub("_\d_*\.jpg", "_%d.jpg" % count, filename) newpath = os.path.join(dirname, newfile) print("%s -> %s : %d byte" % (filename, newfile, size)) renamelist.append([path, newpath]) count -= 1 if len(renamelist) >= 1: v = input("\nRename ? (Y/n)") if v == "y" or v == "Y" or v == "": for v in renamelist: oldpath, newpath = v os.rename(oldpath, newpath) print("\n%d file renamed." % len(renamelist)) else: print("\nCancel.") v = input("\nPush any key") if __name__ == '__main__': main()
- コマンドライン引数を取得 : import sys をしてから sys.argv を参照
- コマンドライン引数の個数を取得 : len(sys.argv)
- python hoge.py で実行した場合、sys.argv[0] には "hoge.py" が入る。
- ファイルサイズ取得 : import os をしてから os.path.getsize(PATH)
- ソート : sorted(リスト)
- 指定のキーでソート : sorted(リスト, key=lambda x: x[1])
- パスからディレクトリ名を取得: os.path.dirname(PATH)
- パスからファイル名を取得 : os.path.basename(PATH)
- パスの結合 : os.path.join(ディレクトリ名, ファイル名)
- 正規表現で置換 : import re してから re.sub(置換前, 置換後, 文字列)
- ファイルリネーム : os.rename(元ファイル名, リネーム名)
- キー入力 : v = input("hoge")
◎ 2022/06/07追記。 :
このスクリプトは、リネーム後のファイル名が既に存在していた場合、妙な動作になりそうだなと気づいた。おそらく、「リネームできねえよ」とエラーを出しそうな気もするけど…。一旦、重複しないであろう仮ファイル名でリネームしておいて、そこから本当に変更したいファイル名にリネームしたほうがいいのかもしれない。元ファイル名と新ファイル名の他に、仮ファイル名も作ってリストに入れておけば処理ができそう。
[ ツッコむ ]
以上です。