Python 業務自動化 | ファイル・フォルダ自動化:基本操作 - 拡張子変更

Python Python
スポンサーリンク

拡張子変更は「ファイル名操作」の基本であり業務自動化の入口

拡張子変更は、業務自動化の中で非常に頻繁に登場します。
「.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.txtreport.csv に変わります。


重要ポイントを深掘り:rename の挙動と注意点

rename は「上書きする可能性がある」

os.rename() は、同名ファイルが存在すると上書きします
業務自動化では事故につながるため、変更前に存在確認を入れるのが安全です。

import os

if os.path.exists(new_path):
    print("警告: すでに同名ファイルが存在します:", new_path)
else:
    os.rename(path, new_path)
Python

rename は「移動」も兼ねている

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)
Python

with_suffix() は「拡張子だけを置き換える」ための専用メソッドで、
splitext よりも読みやすく、ミスが起きにくい書き方です。


拡張子変更を安全にするための考え方

変更前に「存在確認」を必ず入れる

誤上書きを防ぐために、
os.path.exists(new_path) を使って確認するのが基本です。

大量処理では「ログ」を残す

拡張子変更は大量のファイルを扱うことが多いため、
「いつ・どのファイルを変更したか」をログに残すとトラブルが減ります。

splitext と with_suffix の違いを理解する

splitext は「名前と拡張子を分ける」
with_suffix は「拡張子を置き換える」
という違いがあります。


まとめ:拡張子変更は“ファイル名操作の基礎”であり業務自動化の必須スキル

拡張子変更は、業務自動化の中で非常に重要な操作です。

  • ファイル名と拡張子を安全に分ける(splitext)
  • 新しい拡張子を付けて rename する
  • 上書き防止の存在確認を入れる
  • 大量処理ではループと条件分岐を組み合わせる
  • pathlib の with_suffix でより安全に書ける

これらを押さえるだけで、ファイル整理・データ処理・画像変換など、
多くの業務自動化がスムーズに進むようになります。

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