💽

【Python】ファイル名の一括変更 (glob)

2022/12/28に公開

結論


import glob
import os

def rename_file_names(dir_ = '' , suffix = 'out', add_name = 'hoge_'):
    """
    usage:
    (i)  rename_file_names(suffix='out', add_name='hoge_')
    (ii) rename_file_names(dir_='parent',suffix='out', add_name='hoge_')
    (iii)rename_file_names(dir_='parent/parent',suffix='out', add_name='hoge_')
    """
    if dir_:
        file_names = glob.glob(f'{dir_}/*.{suffix}')
    else:
        file_names = glob.glob(f'*.{suffix}')

    for file_name in file_names:
        if dir_:
            file_name = file_name.split('/')[-1] #(ディレクトリ名+ファイル名)から末尾のファイル名を取得
        
	#すでにrenameしているもの以外
        if file_name[:len(add_name)] != add_name:
	    if dir_:
                os.rename(file_name, f'{dir_}/{add_name}{file_name}')
	    else:
	        os.rename(file_name, f'{add_name}{file_name}')

はじめに

内容

glob

globでは正規表現を用いてファイルの相対パスが取得できます。

カレントディレクトリ以外のファイルも一括で取得できます。

if dir_:
    file_names = glob.glob(f'{dir_}/*.{suffix}')
else:
    file_names = glob.glob(f'*.{suffix}')

相対パスからファイル名を取得

パスは/区切りなのでsplitを使って分割します。

ファイル名は、親ディレクトリの数に関わらず、末尾のはずなのでsplitしてできたリストから-1で取得します。

file_name = file_name.split('/')[-1]

os.renameでファイル名の変更

os.renameos.rename(既存のファイル名,renameしたファイル名)として使います。

今回はファイル名に最初に名前をつけるプログラムにしたので実装は以下になります。

os.rename(file_name, f'{add_name}{file_name}')

また対象ディレクトリの中で、renameしたものとrenameしていないものが混在している場合を考えます。

renameしたものを除外するには、ファイル名の最初を比較する必要があるので、以下のように実装すると良いです。

if file_name[:len(add_name)] != add_name:
    # renameの処理

Discussion