wet-to-dry’s blog

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

pythonで再帰的にファイルのリネーム

概要

昨日作成したImageJのJpeg保存コードですが、olympusで写真を撮った後にすぐ回すと、ファイル名が「画像_NNNN.tif.jpg」「画像_NNNN.tifMerge.jpg」とかになってややこしいので、元ファイルを再帰的にリネームすることにしました。

昨日のブログ↓

wet-to-dry.hatenablog.com

やったこと

VScodeになれるべく、VScodeで以下のコードを錬成しました。

実行すると、まずフォルダ指定用のブラウザが現れます。

フォルダを指定した後、コマンドライン上に

  1. 反復する数(撮影条件の数)

  2. 処理区の名前

  3. 撮影条件

を入れると自動で「1. GFP transfection 480nm.tif」みたいな感じで名前を入れてくれます。

Olympusの「画像_NNNN.tif」型専用です。

#! python3
# rename.py - "画像_NNNNN.tif"ファイルを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__))
messagebox.showinfo("○×プログラム", "処理ファイルを選択してください")
folder = filedialog.askdirectory(initialdir=iDir)

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

# 反復回数を決める
repeatNumber = input("反復回数を数字で入力してください:")

if re.fullmatch(r"^\d+$", repeatNumber) == None:
    print("数字を入力してください")
    input("Enter キーで終了")
    exit()

repeatNumber = int(repeatNumber)

if len(filelist) % repeatNumber != 0:
    while True:
        yn = input("ファイル数が割り切れませんが続けますか?y/n:")
        if yn == "y":
            break
        elif yn == "n":
            exit()

# n反復時の名前(処理名)を入力する

sampleNameList = []

i = len(filelist) // repeatNumber

n = 0

while n < i:
    while True:
        sampleName = input(str(n + 1) + "反復目の処理は?:")
        if sampleName != "":
            break

    sampleNameList.append(sampleName)
    n += 1

# ファイル数が割り切れないときの保険
sampleNameList.append("NN")

space = " "

print("処理名の入力終わり!")

# 反復数1の時は撮影条の設定なし

if repeatNumber != 1:

    # 反復内の撮影条件(BF、GFPなど)を入力する

    sampleConditionList = []

    j = repeatNumber

    m = 0

    while m < j:
        while True:
            sampleCondition = input(str(m + 1) + "回目の撮影条件は?:")
            if sampleCondition != "":
                break

        sampleConditionList.append(sampleCondition)
        m += 1

    space = " "

    print("撮影条件の入力終わり!")

else:
    j = repeatNumber
    sampleConditionList = []
    space = ""

# リネーム作業

k = 0

while k < len(filelist):
    shutil.move(folder + "/" + filelist[k], folder + "/" + str(k // j + 1) + ". " +
                sampleNameList[k // j] + space + sampleConditionList[k % j] + ".tif")
    k += 1

参考になったブログ

qiita.com