【Python】ディレクトリの中のファイル名を一括でリネームする

python

Pythonを使って複数のファイルを一括でリネームする方法についてです。

Windows上でもファイルのリネームはツールを使うことで結構簡単にできたりします。例えば、私がよく使う「Flexible Renamer」というフリーのツールは、ファイル名の後ろに連番や日時を付けたり、ファイル名の一部だけを削除したり、といったリネーム操作を複数のファイルに対して一括で出来る便利なツールです。

 ただ、連番や特定の文字を追加するといった一定の規則でしかリネームできないため、例えば、Aというファイル名をBに、Cというファイル名をDに、といったようにファイル名を指定して一括で変更するようなことはできません。

そこで、あらかじめ変更前と後のファイル名をCSVで準備しておき、そのCSVに従ってディレクトリの中のファイル名を一括で変更するスクリプトを作成しました。

では、参考プログラムと手順について説明します。

【準備】CSVファイルを準備する

元のファイル名と変更したいファイル名を記入したCSVファイルを準備します。

CSVのルールは、

  • 1列目に元のファイル名、2列目に変更後のファイル名を書く
  • UTF-8 で保存する

これだけです。

【実行】ファイル名をリネームする

それでは準備したCSVファイルとスクリプトを使ってファイル名をリネームします。

サンプルコード

rename.py

import os
import shutil
import csv
import argparse

# オプション引数を取得する
def get_params():
    parser = argparse.ArgumentParser(description='file rename')
    parser.add_argument("-i", "--input_dir", type=str, required=True, help='input_dir')
    parser.add_argument("-o", "--output_dir", type=str, default="./output", help='output_dir')
    parser.add_argument("-c", "--csv_file", type=str, required=True, help='csv_file')
    args = parser.parse_args()
    return args

# CSVから変更前と変更後のファイル名を積んだリネームリストを生成する
def create_renanme_list(csv_file):
    rename_list = []
    with open(csv_file, encoding="utf-8") as f: # csvファイルを開く
        reader = csv.reader(f)  # csv読込
        for row in reader:  # 1行ずつ取得    
            rename_list.append(row)
    return rename_list

# 入力ディレクトリの中のファイルをリネームして出力ディレクトリにコピーする
def rename_file(input_dir, output_dir, csv_file):

    # 出力ディレクトリがない場合は空のディレクトリを生成
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)  

    # CSVからリネームリストを生成
    rename_list = create_renanme_list(csv_file)
    
    # ファイル名を変更してコピーする
    for list in rename_list:
        if len(list) < 2:
            continue
        org_file = list[0]
        org_file_path = os.path.join(input_dir, org_file)
        if os.path.isfile(org_file_path):
            dst_file = list[1]
            dst_file_path = os.path.join(output_dir, dst_file)
            shutil.copy2(org_file_path, dst_file_path)
            print(org_file, "->", dst_file)

if __name__ == '__main__':
    params = get_params()
    input_dir = params.input_dir
    output_dir = params.output_dir
    csv_file = params.csv_file
    rename_file(input_dir, output_dir, csv_file)

作成したスクリプトの概要は、

1.引数で 次の3つを与える

  • 入力ディレクトリパス ・・・ 変更したいファイルを集めたディレクトリのパス
  • 出力ディレクトリパス ・・・ 変更後のファイルを置くディレクトリのパス
  • CSVファイルパス ・・・ 準備したCSVファイルのパス

2.入力ディレクトリからCSVに書かれた元のファイル名のファイルを探す

3.ファイルをCSVに書かれた変更後のファイル名で出力ディレクトリにコピーする

です。

実行コマンド例

python ./rename.py -i ./test/ -o ./output/ -c ./list.csv

結果

出力ディレクトリにファイル名を変更したファイルが出来ます。

タイトルとURLをコピーしました