./test.txt
というファイルが予め在れば、
./test(001).txt
とリネームされる。
import os
import re
import shutil
filePath = "./test.txt"
# 値はフルパスで渡す
go = duplicate_rename(filePath)
# ファイルを移動
shutil.move(filePath, go)
# 同じファイル名が存在するかチェック
def duplicate_rename(value, count=1):
if os.path.exists(value):
# 存在した場合
# フルパスから「フルパスタイトル」と「拡張子」を分割
ftitle, fext = os.path.splitext(value)
# タイトル末尾に(数値)が在れば削除する。
newftitle = re.sub(r'\(\d{3}\)$', "", ftitle)
# (001) という文字列を作成
addPara = '(' + '{0:3d}'.format(count) + ')'
# フルパスタイトル + (001) + 拡張子のファイル名を作成
fpath = os.path.join(newftitle + addPara + fext)
# リネームしたファイルを表示
print('Rename: %s' % fpath)
# 再度渡してリネームしたファイル名が存在しないかチェック
return (duplicate_rename(fpath, count + 1))
else:
# 存在しない場合
return value
更新
- 2018/11/10 二つ以上同じ名前のファイルがあると、
text(002).txt
ではなくて、text(001)(002).txt
となってしまっていたのを改善。
別の方法を思いついたので書き込み
上記の方法は再帰とimport re
で正規表現も使用して書いたもので、今回はWhile を用いてループ処理で行うようにしたからimport
もos
のみで良いようにした。
import os
import shutil
file_path = './test.txt'
def duplicate_rename2(file_path):
if os.path.exists(file_path):
name, ext = os.path.splitext(file_path)
i = 1
while True:
# 数値を3桁などにしたい場合は({:0=3})とする
new_name = "{} ({}){}".format(name, i, ext)
if not os.path.exists(new_name):
return new_name
i += 1
else:
return file_path
# ファイル名
new_path = duplicate_rename2(file_path)
# ファイルを移動
shutil.move(file_Path, new_path)