[Python] ファイル名を一括で変更する方法【連番ファイル】

Pythonでファイル名を一括で変更し、連番を付けるには、osモジュールやglobモジュールを使用します。

os.listdir()glob.glob()で対象ファイルを取得し、os.rename()でファイル名を変更します。

連番はenumerate()を使って生成できます。

例えば、特定のディレクトリ内のファイルを file_001.txt file_002.txt のようにリネームすることが可能です。

ファイル名のゼロ埋めにはstr.zfill()が便利です。

この記事でわかること
  • Pythonでファイル名を一括変更する方法
  • osモジュールとglobモジュールの活用
  • 連番や日付をファイル名に追加する技術
  • エラーハンドリングの重要性
  • サブディレクトリ内のファイルも対象にする方法

目次から探す

ファイル名を一括変更する基本的な方法

Pythonを使ってファイル名を一括で変更する方法について解説します。

ここでは、主にosモジュールとglobモジュールを使用し、連番を付けたり、ファイル名を変更したりする方法を紹介します。

osモジュールを使ったファイル名変更

osモジュールは、オペレーティングシステムとのインターフェースを提供するモジュールです。

ファイルやディレクトリの操作に便利です。

以下のコードは、osモジュールを使ってファイル名を変更する基本的な方法を示しています。

import os
# 変更したいファイルのパス
old_file_name = "example.txt"
new_file_name = "new_example.txt"
# ファイル名を変更
os.rename(old_file_name, new_file_name)

このコードを実行すると、example.txtというファイルがnew_example.txtに変更されます。

globモジュールを使ったファイル名取得

globモジュールは、特定のパターンにマッチするファイル名を取得するために使用します。

これにより、特定の拡張子を持つファイルを一括で取得することができます。

以下のコードは、.txtファイルを取得する例です。

import glob
# .txtファイルを取得
file_list = glob.glob("*.txt")
# 取得したファイル名を表示
print(file_list)

このコードを実行すると、カレントディレクトリ内のすべての.txtファイルのリストが表示されます。

enumerate()で連番を生成する方法

enumerate()関数を使用すると、リストの要素に対してインデックスを付与することができます。

これを利用して、ファイル名に連番を付けることができます。

以下のコードは、ファイル名に連番を付ける例です。

import glob
# .txtファイルを取得
file_list = glob.glob("*.txt")
# 連番を付けてファイル名を変更
for index, old_file_name in enumerate(file_list, start=1):
    new_file_name = f"file_{index:03}.txt"  # ゼロ埋め
    os.rename(old_file_name, new_file_name)

このコードを実行すると、取得した.txtファイルがfile_001.txt, file_002.txtのように変更されます。

os.rename()でファイル名を変更する方法

os.rename()関数は、ファイル名を変更するための関数です。

前述の通り、old_file_namenew_file_nameを指定することで、簡単にファイル名を変更できます。

以下は、複数のファイル名を一括で変更する例です。

import os
import glob
# .txtファイルを取得
file_list = glob.glob("*.txt")
# ファイル名を変更
for old_file_name in file_list:
    new_file_name = f"new_{old_file_name}"
    os.rename(old_file_name, new_file_name)

このコードを実行すると、すべての.txtファイルの名前の先頭にnew_が追加されます。

ファイル名のゼロ埋めを行う方法

ファイル名に連番を付ける際、ゼロ埋めを行うことで、ファイル名の整合性を保つことができます。

f-stringを使用して、ゼロ埋めを行う方法を以下に示します。

import os
import glob
# .txtファイルを取得
file_list = glob.glob("*.txt")
# 連番を付けてファイル名を変更(ゼロ埋めあり)
for index, old_file_name in enumerate(file_list, start=1):
    new_file_name = f"file_{index:03}.txt"  # ゼロ埋め
    os.rename(old_file_name, new_file_name)

このコードを実行すると、ファイル名がfile_001.txt, file_002.txtのように整然とした形で変更されます。

実際のコード例

ここでは、実際にPythonを使ってファイル名を変更する具体的なコード例を紹介します。

これにより、ファイル名を file_001.txt の形式に変更したり、拡張子を保持したまま変更したり、特定のファイルのみを対象にする方法を学ぶことができます。

ファイル名を file_001.txt の形式に変更する

以下のコードは、カレントディレクトリ内のすべての.txtファイルを取得し、連番を付けて file_001.txt の形式に変更します。

import os
import glob
# .txtファイルを取得
file_list = glob.glob("*.txt")
# 連番を付けてファイル名を変更
for index, old_file_name in enumerate(file_list, start=1):
    new_file_name = f"file_{index:03}.txt"  # ゼロ埋め
    os.rename(old_file_name, new_file_name)

このコードを実行すると、例えばexample1.txt, example2.txtがそれぞれfile_001.txt, file_002.txtに変更されます。

拡張子を保持したままファイル名を変更する

ファイル名を変更する際に、元の拡張子を保持したい場合は、以下のようにos.path.splitext()を使用します。

この関数は、ファイル名と拡張子を分けることができます。

import os
import glob
# .txtファイルを取得
file_list = glob.glob("*.txt")
# 拡張子を保持したままファイル名を変更
for index, old_file_name in enumerate(file_list, start=1):
    # 拡張子を取得
    file_name, file_extension = os.path.splitext(old_file_name)
    new_file_name = f"file_{index:03}{file_extension}"  # ゼロ埋め
    os.rename(old_file_name, new_file_name)

このコードを実行すると、example1.txtfile_001.txtに、example2.txtfile_002.txtに変更され、拡張子はそのまま保持されます。

特定のファイルのみを対象にする方法

特定のファイルのみを対象にして変更する場合、条件を指定してフィルタリングすることができます。

以下のコードは、特定のプレフィックス(例:target_)を持つファイルのみを対象にして、ファイル名を変更します。

import os
import glob
# 特定のプレフィックスを持つ.txtファイルを取得
file_list = glob.glob("target_*.txt")
# 連番を付けてファイル名を変更
for index, old_file_name in enumerate(file_list, start=1):
    new_file_name = f"file_{index:03}.txt"  # ゼロ埋め
    os.rename(old_file_name, new_file_name)

このコードを実行すると、target_example1.txttarget_example2.txtがそれぞれfile_001.txt, file_002.txtに変更されます。

特定の条件に合致するファイルのみを対象にすることで、柔軟なファイル名変更が可能です。

応用例

ここでは、ファイル名を変更する際の応用例をいくつか紹介します。

具体的には、ファイル名に日付を追加したり、元のファイル名の一部を残したり、サブディレクトリ内のファイルも一括で変更する方法について解説します。

ファイル名に日付を追加する方法

ファイル名に日付を追加することで、ファイルの作成日や変更日を明示することができます。

以下のコードは、ファイル名の先頭に現在の日付を追加する例です。

import os
import glob
from datetime import datetime
# 現在の日付を取得
current_date = datetime.now().strftime("%Y%m%d")  # YYYYMMDD形式
# .txtファイルを取得
file_list = glob.glob("*.txt")
# ファイル名に日付を追加
for old_file_name in file_list:
    new_file_name = f"{current_date}_{old_file_name}"
    os.rename(old_file_name, new_file_name)

このコードを実行すると、例えばexample.txt20231005_example.txtのように変更され、日付がファイル名に追加されます。

ファイル名に元のファイル名の一部を残す方法

ファイル名を変更する際に、元のファイル名の一部を残すことも可能です。

以下のコードは、元のファイル名の先頭にnew_を追加し、拡張子を保持したまま変更する例です。

import os
import glob
# .txtファイルを取得
file_list = glob.glob("*.txt")
# 元のファイル名の一部を残して変更
for old_file_name in file_list:
    file_name, file_extension = os.path.splitext(old_file_name)
    new_file_name = f"new_{file_name}{file_extension}"
    os.rename(old_file_name, new_file_name)

このコードを実行すると、example.txtnew_example.txtに変更され、元のファイル名の一部が保持されます。

サブディレクトリ内のファイルも一括で変更する方法

サブディレクトリ内のファイルも一括で変更するには、os.walk()を使用してディレクトリを再帰的に探索することができます。

以下のコードは、指定したディレクトリ内のすべての.txtファイルを対象に、ファイル名を変更する例です。

import os
# 対象のディレクトリ
target_directory = "target_directory"  # 変更したいディレクトリ名
# サブディレクトリ内の.txtファイルを一括で変更
for dirpath, dirnames, filenames in os.walk(target_directory):
    for old_file_name in filenames:
        if old_file_name.endswith(".txt"):
            # 新しいファイル名を生成
            new_file_name = f"new_{old_file_name}"
            # フルパスを作成
            old_file_path = os.path.join(dirpath, old_file_name)
            new_file_path = os.path.join(dirpath, new_file_name)
            os.rename(old_file_path, new_file_path)

このコードを実行すると、target_directory内のすべての.txtファイルがnew_を先頭に付けた名前に変更されます。

サブディレクトリ内のファイルも対象にすることで、より広範囲なファイル名変更が可能になります。

エラーハンドリング

ファイル名を変更する際には、さまざまなエラーが発生する可能性があります。

ここでは、ファイルが存在しない場合、同名ファイルが存在する場合、ファイルのアクセス権限がない場合の対処法について解説します。

ファイルが存在しない場合の対処法

ファイル名を変更する際に、指定したファイルが存在しない場合は、FileNotFoundErrorが発生します。

このエラーを適切に処理するためには、try-except文を使用します。

以下のコードは、ファイルが存在しない場合の対処法を示しています。

import os
old_file_name = "non_existent_file.txt"
new_file_name = "new_file.txt"
try:
    os.rename(old_file_name, new_file_name)
except FileNotFoundError:
    print(f"エラー: '{old_file_name}' は存在しません。")

このコードを実行すると、指定したファイルが存在しない場合にエラーメッセージが表示されます。

同名ファイルが存在する場合の対処法

新しいファイル名が既に存在する場合、FileExistsErrorが発生します。

このエラーを処理するためには、ファイル名を変更する前に、同名ファイルの存在を確認することが重要です。

以下のコードは、同名ファイルが存在する場合の対処法を示しています。

import os
old_file_name = "example.txt"
new_file_name = "example.txt"  # 同名ファイル
if os.path.exists(new_file_name):
    print(f"エラー: '{new_file_name}' は既に存在します。別の名前を指定してください。")
else:
    os.rename(old_file_name, new_file_name)

このコードを実行すると、同名ファイルが存在する場合にエラーメッセージが表示され、ファイル名の変更が行われません。

ファイルのアクセス権限がない場合の対処法

ファイルのアクセス権限がない場合、PermissionErrorが発生します。

このエラーもtry-except文を使用して処理することができます。

以下のコードは、ファイルのアクセス権限がない場合の対処法を示しています。

import os
old_file_name = "protected_file.txt"
new_file_name = "new_protected_file.txt"
try:
    os.rename(old_file_name, new_file_name)
except PermissionError:
    print(f"エラー: '{old_file_name}' に対するアクセス権限がありません。")

このコードを実行すると、指定したファイルに対するアクセス権限がない場合にエラーメッセージが表示されます。

これにより、ユーザーは適切な権限を確認することができます。

よくある質問

ファイル名を変更する際に拡張子を変更しない方法は?

ファイル名を変更する際に拡張子を保持するには、os.path.splitext()を使用してファイル名と拡張子を分けることができます。

以下のように、元のファイル名の拡張子を取得し、新しいファイル名にその拡張子を付け加えることで、拡張子を変更せずにファイル名を変更できます。

file_name, file_extension = os.path.splitext(old_file_name)
new_file_name = f"new_{file_name}{file_extension}"

ファイル名の変更が途中で失敗した場合、どうすればいいですか?

ファイル名の変更が途中で失敗した場合は、エラーハンドリングを行うことで適切に対処できます。

try-except文を使用して、エラーが発生した際に適切なメッセージを表示したり、必要に応じてロールバック処理を行ったりすることが重要です。

例えば、変更前のファイル名を記録しておき、エラーが発生した場合に元の名前に戻すことができます。

サブディレクトリ内のファイルも一括で変更できますか?

はい、サブディレクトリ内のファイルも一括で変更することができます。

os.walk()を使用することで、指定したディレクトリ内のすべてのファイルを再帰的に探索し、条件に合ったファイル名を変更することが可能です。

以下のように、サブディレクトリ内のファイルを対象にすることができます。

for dirpath, dirnames, filenames in os.walk(target_directory):
    for old_file_name in filenames:
        if old_file_name.endswith(".txt"):
            # ファイル名変更処理

この方法を使うことで、特定の拡張子を持つファイルをサブディレクトリも含めて一括で変更することができます。

まとめ

この記事では、Pythonを使用してファイル名を一括で変更する方法について詳しく解説しました。

具体的には、基本的なファイル名変更の手法から、応用例、エラーハンドリングの方法まで幅広く取り上げました。

これを機に、実際のプロジェクトや日常のタスクにおいて、ファイル名の変更を効率的に行うためのスキルを身につけてみてください。

  • URLをコピーしました!
目次から探す