trsing’s diary

勉強、読んだ本、仕事で調べたこととかのメモ。

ファイル名、フォルダ名の変更

pythonで次の処理を行う

  • ファイル名、フォルダ名のsrcをdstに変更する。
  • ファイル内のsrcをdstに変更する。
import os
import glob
import re
from chardet.universaldetector import UniversalDetector

# ファイル名、フォルダ名のsrcをdstに変更する 'absrccd'→'abdstcd'
def rename(dirpath):#絶対パス
    for filefolder in glob.glob(os.path.join(dirpath,'*')):
        if os.path.isdir(filefolder):
            # keyを含むフォルダは飛ばす
            # 完全一致にしたい場合はany(fileorder == ele for ele in['key1', 'key2', 'key3', 'key4'])みたいな感じで
            if(not re.findall('key1|key2|key3|key4', filefolder)):
                rename(filefolder)
        fpath, fname = os.path.split(filefolder)
        if('src' in fname):
            sname = fname.replace('src','dst')
            nname = os.path.join(fpath, sname)
            print(nname)
            os.rename(filefolder, nname)

# ファイル内でsrcをdstに変更する
def refile(dirpath):#絶対パス
    for filefolder in glob.glob(os.path.join(dirpath,'*')):
        if os.path.isdir(filefolder):
            if(not re.findall('key1|key2|key3|key4', filefolder)):
                refile(filefolder)
        else:
            # 拡張子を指定する場合splitextを使う
            _, ext = os.path.split(filefolder)
            # ファイル名にkyeを含むものを対象にする
            if(any(re.findall('ke5|key6|key7|key8', ext))):
                # ファイルごとに文字コードを判定
                encode = detect_character_code(filefolder)
                print(filefolder+':'+encode)
                with open(filefolder, 'r', encoding = encode) as f:
                    filedata = f.read()
                filedata = filedata.replace('src','dst')
                with open(filefolder, 'w', encoding = encode) as f:
                    f.write(filedata)

# ファイルの文字コードを取得
# 参照 https://kazusa-pg.com/python-detect-character-code/
def detect_character_code(filename):
    detector = UniversalDetector()
    with open(filename, 'rb') as f:
        detector.reset()
        for line in f.readlines():
            detector.feed(line)
            if detector.done:
                break
        detector.close()
    return detector.result['encoding']

# ワーキングディレクトリ以下に対して処理をする
cfdr = os.getcwd()
refile(cfdr)       
rename(os.getcwd())

説明

DFSでぐぐいっといって帰りがけに処理をそいっとします。絶対パス前提です*1

参考

note.nkmk.me

kazusa-pg.com

他にもあるけど記憶が曖昧・・・

所感

久しぶりのpython。完全に頭からダストシュートされてた隠居したい。
処理内容的に既存のツール使えばええんちゃう?という気しかしないけどまあいいや。
使い捨てでも関数名や変数名もうちょっと考えて付けた方が良いと思いました。

*1:と思ったけど相対でも動くか・・・