拡張子変更は「ファイル名操作」の基本であり業務自動化の入口
拡張子変更は、業務自動化の中で非常に頻繁に登場します。
「.txt を .csv に変換したい」「画像ファイルの拡張子を一括変更したい」「処理済みファイルに .done を付けたい」など、実務では日常的に必要になります。
Pythonでは os.rename() と os.path.splitext() を組み合わせることで、安全かつ確実に拡張子を変更できます。
ここでは、初心者でも理解しやすいように、仕組みから実務テンプレートまで丁寧に解説します。
拡張子変更の基本:os.rename と splitext の組み合わせ
splitext で「名前」と「拡張子」を分ける
拡張子変更の最重要ポイントは、ファイル名と拡張子を正しく分離することです。
これを自力で文字列操作するとミスが起きやすいため、Python標準の os.path.splitext() を使います。
import os
path = "data/report.txt"
name, ext = os.path.splitext(path)
print(name) # data/report
print(ext) # .txt
Pythonこのように、splitext は「拡張子を含まないパス」と「拡張子」を安全に分けてくれます。
rename で新しい拡張子に変更する
拡張子を変えるには、splitext で分けた「名前」に新しい拡張子を付けて rename します。
import os
path = "data/report.txt"
name, ext = os.path.splitext(path)
new_path = name + ".csv"
os.rename(path, new_path)
print("変更:", new_path)
Pythonこれで report.txt が report.csv に変わります。
重要ポイントを深掘り:rename の挙動と注意点
rename は「上書きする可能性がある」
os.rename() は、同名ファイルが存在すると上書きします。
業務自動化では事故につながるため、変更前に存在確認を入れるのが安全です。
import os
if os.path.exists(new_path):
print("警告: すでに同名ファイルが存在します:", new_path)
else:
os.rename(path, new_path)
Pythonrename は「移動」も兼ねている
os.rename() は、拡張子変更だけでなく、
別フォルダへの移動も同時に行えるという特徴があります。
os.rename("data/report.txt", "backup/report.csv")
Pythonこのように、拡張子変更と移動を一度に行うことも可能です。
例題①:フォルダ内の .txt をすべて .csv に変更する
シナリオ
inbox フォルダに大量の .txt ファイルがあり、
すべて .csv に変換したいというケースです。
コード例
import os
folder = "inbox"
for name in os.listdir(folder):
path = os.path.join(folder, name)
if not os.path.isfile(path):
continue
base, ext = os.path.splitext(path)
if ext.lower() != ".txt":
continue
new_path = base + ".csv"
if os.path.exists(new_path):
print("スキップ(同名あり):", new_path)
continue
os.rename(path, new_path)
print("変更:", path, "→", new_path)
Pythonこのテンプレートは、実務でそのまま使えるレベルです。
例題②:処理済みファイルに「.done」を付ける
シナリオ
処理が終わったファイルに「.done」を付けて、
「処理済み」であることを明示したいケースです。
コード例
import os
path = "data/input.csv"
if os.path.isfile(path):
new_path = path + ".done"
os.rename(path, new_path)
print("処理済み:", new_path)
else:
print("ファイルがありません:", path)
Pythonこの方法は、バッチ処理やETL処理で非常によく使われます。
例題③:複数の拡張子をまとめて変更する(jpg → png など)
シナリオ
画像フォルダに .jpg と .jpeg が混在しており、
すべて .png に統一したいケースです。
コード例
import os
folder = "images"
for name in os.listdir(folder):
path = os.path.join(folder, name)
if not os.path.isfile(path):
continue
base, ext = os.path.splitext(path)
if ext.lower() not in [".jpg", ".jpeg"]:
continue
new_path = base + ".png"
if os.path.exists(new_path):
print("スキップ(同名あり):", new_path)
continue
os.rename(path, new_path)
print("変更:", path, "→", new_path)
Python複数拡張子をまとめて扱うときは、ext.lower() を使って大文字小文字の揺れを吸収するのがポイントです。
pathlib を使った、よりモダンで読みやすい書き方
Path.with_suffix() で拡張子を安全に変更する
pathlib を使うと、拡張子変更がさらに直感的に書けます。
from pathlib import Path
p = Path("data/report.txt")
new_p = p.with_suffix(".csv")
p.rename(new_p)
print("変更:", new_p)
Pythonwith_suffix() は「拡張子だけを置き換える」ための専用メソッドで、
splitext よりも読みやすく、ミスが起きにくい書き方です。
拡張子変更を安全にするための考え方
変更前に「存在確認」を必ず入れる
誤上書きを防ぐために、os.path.exists(new_path) を使って確認するのが基本です。
大量処理では「ログ」を残す
拡張子変更は大量のファイルを扱うことが多いため、
「いつ・どのファイルを変更したか」をログに残すとトラブルが減ります。
splitext と with_suffix の違いを理解する
splitext は「名前と拡張子を分ける」
with_suffix は「拡張子を置き換える」
という違いがあります。
まとめ:拡張子変更は“ファイル名操作の基礎”であり業務自動化の必須スキル
拡張子変更は、業務自動化の中で非常に重要な操作です。
- ファイル名と拡張子を安全に分ける(splitext)
- 新しい拡張子を付けて rename する
- 上書き防止の存在確認を入れる
- 大量処理ではループと条件分岐を組み合わせる
- pathlib の with_suffix でより安全に書ける
これらを押さえるだけで、ファイル整理・データ処理・画像変換など、
多くの業務自動化がスムーズに進むようになります。
