背景
画像処理とか機械学習で, img-000.png
, img-001.png
... などとファイル名を連番で(or 既存ファイル名を上書きしないようにユニークな名前にしたい)作りたい.
imageio とか pytorch あたりにユーティリティ関数としてありそうですが, どうも無さそうなので自作します!
方法
現状はファイル名を見て, 存在するかどうかで処理するしかなさそうです.
今回, 最新ファイル名は同じにしたいので, たとえば既存ファイルがあったら, それを test-0000.png
, test-0001.png
, ... にリネームというふうにしてみました.
import os
from pathlib import Path
def rename_existing_file(filename):
p = Path(filename)
if p.exists():
ftup = os.path.splitext(filename)
# find new filename
i = 0
while i < 1000:
target_name = "{}-{:0>4}{}".format(ftup[0], i, ftup[1])
target_p = Path(target_name)
if target_p.exists():
print("target {} exists".format(target_name))
i = i + 1
continue
else:
break
# TODO: print warn when i == 1000
# rename
p.rename(target_p)
print("{} renamed to {}".format(p, target_p))
if __name__ == '__main__':
fname = "test.png"
rename_existing_file(fname)
ファイル数が多量の場合
1 万ファイルとかになると, ひとつづつファイルのチェックするのもコストになりそうですから, ディレクトリ内のファイル数を見て連番名を決めてみるとかの対応にしたほうがよさそうです!