背景
アウトプットとしてExcel等のファイルを書き出す場合、保存先のフォルダに同一名の大切なファイルがあったのに上書きされちゃって、後々にしまった!と思ったことがあるので、備忘録もかねて同じファイルが存在したら(1)、(2)、(3)…とナンバリングされるようなコードを書きました。
(環境はwindows10のpython3.7.1です。)
コード説明
while文の前の準備
1:ファイル名を記載。(ここでは"テスト.xlsx")
2:ディレクトリからファイル名のリスト(files)を取得。
while文1周目
1:while文でもし、同じ名前のファイル("テスト.xlsx")がファイル名のリスト"files"中にあったら"(1)"をつける。
("テスト.xlsx"から".xlsx"を一度消去して、"(1).xlsx"を付けています。)
2:number という変数で"(num-1)"つまり(0)がファイル名にあれば消えるようにする。
(1周目のwhile文ではこの操作は関係ないです)
3:num =2になる。
while文2周目
1:もし"テスト(1).xlsx"もフォルダ内に存在する場合、"(2)"をファイル名につける。
("テスト(1).xlsx"から".xlsx"を一度消去して、"(2).xlsx"を付けています。)
2:"(num-1)"つまり、今回は"(1)が"ファイル名にあれば消えるようにする。
(つまり"テスト(1)(2).xlsx"から"(1)"を消す。)
import os
filename = "テスト.xlsx"
num = 1
files = os.listdir(base_path)
while filename in files:
filename = filename(".xlsx","") + "(" + str(num) + ").xlsx"
number = "(" + str(num-1) + ")"
filename = filename.replace(number,"")
num = num + 1
もし、デフォルトのファイル名に(1)とかが入ってる場合(”20210515(1)解析.xlsx”みたいな場合)、while文中で(1)が消えちゃうので、そういった場合はrstripで"(数字).xlsx"を消す作業に変更してもよいかもしれません。(いや、むしろこっちの方が良いコードかも?)
import os
filename = "テスト.xlsx"
num = 1
files = os.listdir(base_path)
while filename in files:
filename = filename.rstrip(".xlsx")
number = "(" + str(num-1) + ")"
filename = filename.rstrip(number)
filename = filename + "(" + str(num) + ").xlsx"
num = num + 1
20211103:誤字訂正しました。