Pythonのos
, glob
モジュールを使って、フォルダ内のファイル名を一括で変更する方法について説明します。
使用モジュール
インストール:不要
インストール:不要
ディレクトリ構成
以下のようなディレクトリ、ファイル構成を例として、ファイル名を変更する方法を解説していきます。Pythonスクリプトファイルは、ファイル名を変更するファイルが格納されているフォルダと同じ階層にある状態とします。
├── remane.py
└── test
├── a.csv
├── b.csv
├── c.csv
├── d.csv
└── e.csv
ファイル名を連番に変更
変更した結果は以下のようになります。
├── remane.py
└── test
├── 001.csv
├── 002.csv
├── 003.csv
├── 004.csv
└── 005.csv
プログラムは以下のようになります。
1 2 3 4 5 6 | import os import glob path ="./test" files = glob.glob(path + '/*') for i, f in enumerate(files, 1): os.rename(f, os.path.join(path, '{0:03d}'.format(i) + '.csv')) |
手順は以下のようになります。
1. glob
モジュールでフォルダ内のファイル名の一覧を取得
2. os
モジュールで1ファイルずつファイル名変更
3. 元のパスに連結
ポイントを解説します。
1 2 | path ="./test" files = glob.glob(path + '/*') |
path
に対象となるファイルが格納されているフォルダを設定します。
対象フォルダpathに /* を連結して、フォルダ内の全てのファイルを対象としてglob.glob()
でファイル名の一覧をfiles
にリストとして取得します。
filesの内容は以下のようになります。
[‘./test\a.csv’, ‘./test\b.csv’, ‘./test\c.csv’, ‘./test\d.csv’, ‘./test\e.csv’]
1 2 | for i, f in enumerate(files, 1): os.rename(f, os.path.join(path, '{0:03d}'.format(i) + '.csv')) |
リストfiles
をforループで処理して、1ファイルずつファイル名を変更します。enumerate()
で連番i
を生成していますが、初期設定では0から開始されてしまうため、第二引数に1を指定することで連番を1から開始しています。
また、数字の前をゼロ埋めして001のようにするためにインデックス番号を用いて'{0:03d}'.format(i)
とし、os.path.join()
でpath='./test'
と結合しています。
ファイル名の前に連番や文字列を追加
以下のようにファイル名の前に、「 連番_ 」を追加します。
├── 001_a.csv
├── 002_b.csv
├── 003_c.csv
├── 004_d.csv
└── 005_e.csv
連番を追加する場合は、enumerate()
を使い連番を生成して、ファイル名と連結します。
1 2 3 4 5 6 | import os import glob path ="./test" files = glob.glob(path + '/*') for i, f in enumerate(files, 1): os.rename(f, os.path.join(path, '{0:03d}'.format(i) + '_' + os.path.basename(f))) |
次にファイル名の前に共通の文字列を追加して「work_○.csv」のようにファイル名を変更します。
└── test
├── work_a.csv
├── work_b.csv
├── work_c.csv
├── work_d.csv
└── work_e.csv
プログラムは以下のようになります。
1 2 3 4 5 6 7 | import os import glob path ="./test" files = glob.glob(path + '/*') str = "work_" #追加文字列 for f in files: os.rename(f, os.path.join(path, str + os.path.basename(f))) |
ここではパス文字列f
から、拡張子付きのファイル名を取得するために、os.path.basename()
を使用しています。
ファイル名の後に文字列や連番を追加
ファイル名の後ろに共通の文字列を追加して「a_work.csv」のようにファイル名を変更します。
1 2 3 4 5 6 7 | import os import glob path ="./test" files = glob.glob(path + '/*') for f in files: ftitle, fext = os.path.splitext(f) os.rename(f, ftitle + '_work' +fext) |
結果は以下のようになります。
└── test
├── a_work.csv
├── b_work.csv
├── c_work.csv
├── d_work.csv
└── e_work.csv
連番を追加する場合は以下のようになります。
1 2 3 4 5 6 7 | import os import glob path ="./test" files = glob.glob(path + '/*') for i, f in enumerate(files, 1): ftitle, fext = os.path.splitext(f) os.rename(f, ftitle + '_' + '{0:03d}'.format(i) + fext) |
以下が結果です。
└── test
├── a_001.csv
├── b_002.csv
├── c_003.csv
├── d_004.csv
└── e_005.csv
次に日付情報を追加してみます。処理時点の日付を取得するにはdatetime
モジュールのtoday()
メソッドを使用します。
1 2 3 4 5 6 7 8 9 10 | import os import glob import datetime path ="./test" files = glob.glob(path + '/*') today = datetime.date.today() strdate = today.strftime('%Y%m%d') for f in files: ftitle, fext = os.path.splitext(f) os.rename(f, ftitle + '_work_' + strdate +fext) |
結果は以下のようになります。
├── b_work_20220101.csv
├── c_work_20220101.csv
├── d_work_20220101.csv
└── e_work_20220101.csv
Python の osモジュール、globモジュールを使ってファイル名を一括で変更する方法について解説しました。