[Python] ファイル名を一括で変更する方法【連番ファイル】
Pythonでファイル名を一括で変更し、連番を付けるには、os
モジュールやglob
モジュールを使用します。
os.listdir()
やglob.glob()
で対象ファイルを取得し、os.rename()
でファイル名を変更します。
連番はenumerate()
を使って生成できます。
例えば、特定のディレクトリ内のファイルを file_001.txt
file_002.txt
のようにリネームすることが可能です。
ファイル名のゼロ埋めにはstr.zfill()
が便利です。
ファイル名を一括変更する基本的な方法
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_name
とnew_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.txt
がfile_001.txt
に、example2.txt
がfile_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.txt
やtarget_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.txt
が20231005_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.txt
がnew_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}' に対するアクセス権限がありません。")
このコードを実行すると、指定したファイルに対するアクセス権限がない場合にエラーメッセージが表示されます。
これにより、ユーザーは適切な権限を確認することができます。
まとめ
この記事では、Pythonを使用してファイル名を一括で変更する方法について詳しく解説しました。
具体的には、基本的なファイル名変更の手法から、応用例、エラーハンドリングの方法まで幅広く取り上げました。
これを機に、実際のプロジェクトや日常のタスクにおいて、ファイル名の変更を効率的に行うためのスキルを身につけてみてください。