wet-to-dry’s blog

京大大学院生の備忘録ブログ

pythonであるフォルダ内のファイル名を参照して別のフォルダ内のファイルをリネーム

初めに

以前にpythonでファイル名を自動で書き直してくれるコードを書きました。

wet-to-dry.hatenablog.com

これを改変して、あるフォルダにあるファイルの名前をリスト化して、他のフォルダにあるファイル名をリスト通りに変更するコードを作りました。

f:id:wet-to-dry:20201001210732j:plain

こんな感じ。

変更する側のフォルダ内のファイルは、前回と同様"画像_0001.tif"みたいにolympusの顕微鏡の出力を前提としています。

ファイル内のコメントでも書いてますが、10は1と2の間に数えられるので、変更元のフォルダ内のファイル名が数字で始まっていて、且つ10以上である場合は注意が必要です*1

結果

#! python3
# rename same folder.py - あるフォルダ内のファイル名を他のフォルダ内のファイル名にするため、forループを用いてrenameする
# 10は1と2の間に数えられるので、区画が10以上ある場合は注意

from tkinter import Tk, messagebox, filedialog
import os
import glob
import re
import shutil


# ファイル選択ダイアログの表示
root = Tk()
root.title(u"変更するフォルダーの選択")
root.withdraw()
iDir = os.path.abspath(os.path.dirname(__file__))
messagebox.showinfo("○×プログラム", "変更するフォルダーを選択してください")
cfolder = filedialog.askdirectory(initialdir=iDir)

root = Tk()
root.title(u"元となるフォルダーの選択")
root.withdraw()
messagebox.showinfo("○×プログラム", "元となるフォルダーを選択してください")
rfolder = filedialog.askdirectory(initialdir=cfolder)

# ファイルのリストを取り込む
cfilelist = []
for f in glob.glob(cfolder + "/画像_*.tif"):
    cfilelist.append(os.path.split(f)[1])

rfilelist = []
for g in glob.glob(rfolder + "/*.tif"):
    rfilelist.append(os.path.split(g)[1])

# リネーム作業

k = 0

while k < len(cfilelist):
    shutil.move(cfolder + "/" + cfilelist[k], cfolder + "/" + rfilelist[k])
    k += 1

まとめ

tkinterは便利ですね。

これで面倒くさい作業は大概自動化できたかな?

追記 (2020/10/26)

10以上の数にも対応できるようにしました。

ファイル名が「'/d+'. 」の正規表現で引っかかってくるものであればこれでできます。(例:「24. HEK293T d4 EGFP-OE.tif」)

#! python3
# rename same folder more than 10.py - あるフォルダ内のファイル名を他のフォルダ内のファイル名にするため、forループを用いてrenameする

from tkinter import Tk, messagebox, filedialog
import os
import glob
import re
import shutil


# ファイル選択ダイアログの表示
root = Tk()
root.title(u"変更するフォルダーの選択")
root.withdraw()
#iDir = os.path.abspath(os.path.dirname(__file__))
iDir = "C:/Users/shinn/OneDrive - Kyoto University/南研/data"
messagebox.showinfo("○×プログラム", "変更するフォルダーを選択してください")
cfolder = filedialog.askdirectory(initialdir=iDir)

root = Tk()
root.title(u"元となるフォルダーの選択")
root.withdraw()
messagebox.showinfo("○×プログラム", "元となるフォルダーを選択してください")
rfolder = filedialog.askdirectory(initialdir=cfolder)

# ファイルのリストを取り込む
cfilelist = []
for f in glob.glob(cfolder + "/画像_*.tif"):
    cfilelist.append(os.path.split(f)[1])

rfilelist = []
for g in glob.glob(rfolder + "/*.tif"):
    rfilelist.append(os.path.split(g)[1])

# 10以上あるときのsearchにおいて、数値無しを0とする関数
def extract_num(s, p, ret=0):
    search = p.search(s)
    if search:
        return int(search.groups()[0])
    else:
        return ret


# 10以上あるときのリストの並べ替え
p = re.compile(r'(\d+). (.+).tif')
rfilelist_sorted = sorted(rfilelist, key=lambda s: extract_num(s, p))

# リネーム作業

k = 0

while k < len(cfilelist):
    shutil.move(cfolder + "/" + cfilelist[k],
                cfolder + "/" + rfilelist_sorted[k])
    k += 1

参考文献

note.nkmk.me

*1:一応1-9の後に10を配置する方法もあるらしいですが、面倒くさいので採用してません。note.nkmk.me