フォルダ内のスクショ画像のファイル名を一括で連番に変更
このコードを保存したPythonファイルの名前をrename_filename.pyとし、このファイルがある場所をカレントディレクトリとして、そこに./abc
フォルダがあった場合、python rename_filename.py ./abc
のようなコマンドを実行することでabcフォルダの中の画像ファイルだけを選択して名前変更することができます。
import glob
import sys
import os
import re
from pprint import pprint
if len(sys.argv) == 1:
DIR = './'
elif len(sys.argv) > 2:
print('error: 引数が多すぎます.フォルダ名を1つだけ指定してください.')
sys.exit(0)
elif os.path.exists(sys.argv[1]):
DIR = sys.argv[1]
else:
print('error: フォルダ名が間違っています.存在するフォルダ名を指定してください.')
sys.exit(0)
# 入力画像表示のパス
path = os.path.join(DIR, '* (*).png') # スクリーンショットのデフォルトの名前になっているファイルを変更の対象とする
# path = os.path.join(DIR, '*_*.png') # example_1.pngみたいな名前になっているファイルを変更の対象とする
# path = os.path.join(DIR, '*.png') # 全PNGファイルを変更の対象とする
# 出力表示用のパス
# path_res = os.path.join(DIR, '*_*.png') # example_1.pngみたいな名前になっているファイルのみ結果表示
path_res = os.path.join(DIR, '*.png') # フォルダ内の全PNGファイルの名前を結果表示
# 変更前のフォルダ内のファイルの名前を表示
flist = glob.glob(path)
print('変更前')
pprint(sorted(flist, key=lambda s: int(re.search(r'\d+', s).group())))
# 実際に名前を変更する or 変更はせずにどう名前が変わるかだけ確認する
print('ファイル名を一括で変更しますか?')
print('ファイル名の変更を実行: yes, 変更後のファイル名がどうなるかだけ確認: no')
while True:
answer = input('[y/N]: ')
Fl = answer[0].lower()
if answer == '' or not Fl in ['y', 'n']:
print('yまたはnを入力してください')
else:
break
if Fl == 'y':
flag = True
print('ファイル名を変更します.')
elif Fl == 'n':
flag = False
print('変更後のファイル名がどうなるかの確認だけをします.')
print('連番の数字(_i)の前につけるファイル名を指定してください: ')
name = input('name: ')
# ファイル名を一括で変更する
i = 1
for file in sorted(flist, key=lambda s: int(re.search(r'\d+', s).group())):
if flag:
os.rename(file, os.path.join(DIR, name + '_' + str(i) + '.png'))
print(f'{file} → {os.path.join(DIR, name + "_" + str(i) + ".png")}')
i += 1
# 結果表示
flist = glob.glob(path_res)
print('変更後')
pprint(sorted(flist, key=lambda s: int(re.search(r'_(\d)+', s).group()[1:])))
0埋めされてない連番の数字の文字列に対してちゃんと数値の大小でソートする方法
これがやっかいでしたが、この記事で解決しました。