💽
【Python】ファイル名の一括変更 (glob)
結論
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.rename
はos.rename(既存のファイル名,renameしたファイル名)
として使います。
今回はファイル名に最初に名前をつけるプログラムにしたので実装は以下になります。
os.rename(file_name, f'{add_name}{file_name}')
また対象ディレクトリの中で、renameしたものとrenameしていないものが混在している場合を考えます。
renameしたものを除外するには、ファイル名の最初を比較する必要があるので、以下のように実装すると良いです。
if file_name[:len(add_name)] != add_name:
# renameの処理
Discussion