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追記。 :
このスクリプトは、リネーム後のファイル名が既に存在していた場合、妙な動作になりそうだなと気づいた。おそらく、「リネームできねえよ」とエラーを出しそうな気もするけど…。一旦、重複しないであろう仮ファイル名でリネームしておいて、そこから本当に変更したいファイル名にリネームしたほうがいいのかもしれない。元ファイル名と新ファイル名の他に、仮ファイル名も作ってリストに入れておけば処理ができそう。
[ ツッコむ ]
以上です。