こんにちはしろです
こういうファイルをソートしようと思ったときファイル内ではうまく並び替えれるのにPython などで処理をしようと思ったら。
このように予想した並びと違う順序になることがあります。。。
これに詰まったので自分用のメモとして書き残しておきます。
##対処法
添字の前に余分に0000をおくことです。これにより問題は解決できます。
しかし、名前すべて手作業で書き換えるのは面倒なのですべてPythonに任せてしまいましょう。
前提として、もとのファイルの添字を足す場合のみを考えます。
ex)img32.png ⇒ img00032.png
必要となる知識
- ファイル名の取得(osを使う)
- 名前から添字の取得(正規表現の使用)
- ファイルの名前変更(shutilの使用)
です。簡単なので1つずつ終わらして行きましょう。
1. ファイル名の取得(os)
ファイル名を取得するにはosというものを使います。
import os
file_dl = './File/'
res = os.listdir(file_dl)
これだけでfile でしていたファイル内にあるものの名前がすべて取得出来ました。
2. 名前からの添字の取得(正規表現 re)
次は取得したファイル名から添字を取得しましょう。
import re
file_index = re.search(r'\d{1,}', 'img012.png').group()
ここでは正規表現と言うものをつかって数字だけを文字列から取得しています。
この場合だとimg012.pngから012だけが抜き出されfile_indexに格納されてます。
3ファイルの移動(shutil)
最後に名前を変更して保存するのですがそれにはshutil を使います。
やってることは名前を変更して元の場所に移動させているだけです。
import shutil
shutil.move(old_path,new_path)
こうすることでnew_path にold_pathにあったものが移動させることが出来ました。
まとめ
以上のことを連結させると
import os
import shutil
import re
file_dl = './File/'
name = 'img_name'
#ファイル内のフォルダ名を取得
res = os.listdir(file_dl)
#for文を用いて1つずつファイルを取り出す。
for target_name in res:
#ファイルのパスとファイル名を結合
target_dl = file_dl + target_name
#正規表現を用いて添字だけを取り出す
target_index = int(re.search(r'\d{1,}', target_name).group())
#新しいファイル名の作成
target_new_name = name+str("{0:05d}".format(target_index))+'.png'
#ファイルの名前を変更して保存し直し
shutil.move(target_dl,file_dl+target_new_name)