Pythonでフォルダ内のファイルの名前を一括変更

フォルダ内のスクショ画像のファイル名を一括で連番に変更

このコードを保存した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埋めされてない連番の数字の文字列に対してちゃんと数値の大小でソートする方法

これがやっかいでしたが、この記事で解決しました。

参考 Pythonでゼロ埋めなしの数字の文字列リストをソートnote.nkmk.me

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です