Pythonでファイルを扱う場面では、「ファイルパスから名前だけを取り出したい」「拡張子を除いたファイル名が欲しい」といったニーズが頻繁に発生します。
特に、複数ファイルを扱う自動処理やログの命名などで、ファイル名の操作は欠かせません。
この記事では、Pythonでファイル名を取得する基本的な方法から、拡張子の除去やディレクトリ部分の除外といった応用テクニックまでを、わかりやすく解説します。
プログラミング初心者の方でも理解できるよう、一つずつ丁寧に説明していきます。
ファイル名を取得する基本の方法(os.path編)

説明
Pythonの標準ライブラリos.path
を使えば、パスからファイル名を簡単に取り出すことができます。
os.path.basename()
という関数は、最後の「/」以降の部分を返す関数です。これを使うことで、長いパスからファイル名だけを抜き出すことができます。
基本的な使い方
import os
# ファイルパスからファイル名を取得
file_path = "/home/user/data/sample.csv"
file_name = os.path.basename(file_path)
print(file_name) # 出力: sample.csv
Windowsでの場合
import os
# Windowsのパスでも同じように動作します
file_path = "C:\\Users\\user\\Documents\\report.xlsx"
file_name = os.path.basename(file_path)
print(file_name) # 出力: report.xlsx
複数のパスを処理する例
import os
# 複数のファイルパスがある場合
paths = [
"/home/user/data/file1.txt",
"/home/user/images/photo.jpg",
"/home/user/documents/report.pdf"
]
for path in paths:
filename = os.path.basename(path)
print(f"パス: {path} → ファイル名: {filename}")
この章のまとめ:os.path.basename()
を使えば、ディレクトリ構造を含むパスからシンプルにファイル名だけを取り出せます。次は拡張子の処理について見てみましょう。
拡張子を除いたファイル名を取得する方法
説明
ファイル名のうち、拡張子を除きたいときはos.path.splitext()
を使います。
この関数は、(ファイル名, 拡張子)というタプルを返す便利な関数です。タプルの最初の要素がファイル名、2番目の要素が拡張子になります。
基本的な使い方
import os
# 拡張子を除いたファイル名を取得
file_name_with_ext = "sample.csv"
name_only = os.path.splitext(file_name_with_ext)[0]
extension = os.path.splitext(file_name_with_ext)[1]
print(f"ファイル名: {name_only}") # 出力: sample
print(f"拡張子: {extension}") # 出力: .csv
パスと組み合わせて使う例
import os
# ファイルパスから拡張子なしのファイル名を取得
file_path = "/home/user/data/sample.csv"
# まずファイル名を取得
file_name = os.path.basename(file_path)
# 次に拡張子を除去
name_only = os.path.splitext(file_name)[0]
print(name_only) # 出力: sample
より簡潔に書く方法
import os
# 一行で書くこともできます
file_path = "/home/user/data/sample.csv"
name_only = os.path.splitext(os.path.basename(file_path))[0]
print(name_only) # 出力: sample
複数の拡張子がある場合
import os
# .tar.gz のような複数の拡張子がある場合
file_name = "archive.tar.gz"
name, ext = os.path.splitext(file_name)
print(f"名前: {name}") # 出力: archive.tar
print(f"拡張子: {ext}") # 出力: .gz
# .tar も除きたい場合は、もう一度実行
name_final, ext2 = os.path.splitext(name)
print(f"最終的な名前: {name_final}") # 出力: archive
この章のまとめ:拡張子を除いたファイル名が必要なときは、.splitext()
を併用するのが基本です。次に、より現代的な方法であるpathlib
も見てみましょう。
pathlibでのファイル名取得(Python 3.4以降)
説明
pathlib
モジュールは、オブジェクト指向のインターフェースでより直感的にファイル操作が可能です。
Python 3.4以降で利用でき、従来のos.path
よりも読みやすく、理解しやすいコードが書けます。
基本的な使い方
from pathlib import Path
# Pathオブジェクトを作成
path = Path("/home/user/data/sample.csv")
# ファイル名に関する情報を取得
print(f"フルパス: {path}") # /home/user/data/sample.csv
print(f"ファイル名: {path.name}") # sample.csv
print(f"拡張子なし: {path.stem}") # sample
print(f"拡張子: {path.suffix}") # .csv
print(f"親ディレクトリ: {path.parent}") # /home/user/data
各プロパティの詳細説明
from pathlib import Path
path = Path("/home/user/documents/report.xlsx")
# name: ファイル名(拡張子付き)
print(f"name: {path.name}") # report.xlsx
# stem: 拡張子なしのファイル名
print(f"stem: {path.stem}") # report
# suffix: 拡張子(ドット付き)
print(f"suffix: {path.suffix}") # .xlsx
# suffixes: 全ての拡張子のリスト
complex_path = Path("archive.tar.gz")
print(f"suffixes: {complex_path.suffixes}") # ['.tar', '.gz']
Windowsでも同じように使える
from pathlib import Path
# WindowsのパスでもLinux/Macのパスでも同じ書き方
windows_path = Path("C:/Users/user/Documents/file.txt")
linux_path = Path("/home/user/documents/file.txt")
print(f"Windows: {windows_path.name}") # file.txt
print(f"Linux: {linux_path.name}") # file.txt
実際のファイルが存在するかチェック
from pathlib import Path
path = Path("sample.txt")
# ファイルが存在する場合のみファイル名を取得
if path.exists():
print(f"ファイル名: {path.name}")
else:
print("ファイルが見つかりません")
この章のまとめ:pathlib
を使うと、ファイル名や拡張子を属性として簡潔に取得できます。次の章では、複数ファイルの処理に応用してみましょう。
複数ファイルから一括でファイル名を取得する

説明
あるディレクトリ内の全ファイルの名前を取得する処理も、簡単に実現できます。
Path.iterdir()
は、指定ディレクトリ内のファイルやフォルダをイテレータ形式で取得する便利なメソッドです。
基本的なディレクトリ内ファイル一覧
from pathlib import Path
# 指定したディレクトリ内のファイル名を全て取得
folder = Path("./data") # カレントディレクトリのdataフォルダ
# ファイルのみを対象とする
file_names = [file.name for file in folder.iterdir() if file.is_file()]
print("ファイル一覧:")
for name in file_names:
print(f" {name}")
特定の拡張子のファイルのみを取得
from pathlib import Path
folder = Path("./images")
# .jpg ファイルのみを取得
jpg_files = [file.name for file in folder.iterdir()
if file.is_file() and file.suffix.lower() == '.jpg']
print("JPGファイル:")
for jpg in jpg_files:
print(f" {jpg}")
ファイル名と詳細情報を一緒に取得
from pathlib import Path
import os
folder = Path("./documents")
print("ファイル詳細情報:")
for file in folder.iterdir():
if file.is_file():
# ファイルサイズも一緒に取得
size = file.stat().st_size
print(f"名前: {file.name}")
print(f" 拡張子なし: {file.stem}")
print(f" 拡張子: {file.suffix}")
print(f" サイズ: {size} バイト")
print("-" * 30)
サブディレクトリも含めて再帰的に検索
from pathlib import Path
def get_all_files(directory):
"""ディレクトリ内のすべてのファイル名を再帰的に取得"""
all_files = []
for item in Path(directory).rglob("*"):
if item.is_file():
all_files.append(item.name)
return all_files
# 使用例
folder = Path("./project")
all_file_names = get_all_files(folder)
print(f"全ファイル数: {len(all_file_names)}")
for name in all_file_names[:10]: # 最初の10個だけ表示
print(f" {name}")
os.path版での複数ファイル処理
import os
# os.path版での書き方
folder_path = "./data"
file_names = []
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isfile(file_path):
file_names.append(filename)
print("ファイル一覧(os.path版):")
for name in file_names:
print(f" {name}")
この章のまとめ:複数ファイルの管理でも、ファイル名の取得処理はシンプルに実装できます。最後に、応用ポイントを整理して締めくくります。
実践的な応用例
ファイル名の一括変更
from pathlib import Path
def rename_files_with_prefix(directory, prefix):
"""指定ディレクトリ内のファイル名に接頭語を追加"""
folder = Path(directory)
for file in folder.iterdir():
if file.is_file():
# 新しいファイル名を作成
new_name = f"{prefix}_{file.name}"
new_path = file.parent / new_name
print(f"{file.name} → {new_name}")
# 実際の名前変更(コメントアウト推奨)
# file.rename(new_path)
# 使用例
rename_files_with_prefix("./photos", "vacation_2024")
ログファイル名の生成
from pathlib import Path
from datetime import datetime
def create_log_filename(base_name="log"):
"""現在の日時を含むログファイル名を生成"""
now = datetime.now()
timestamp = now.strftime("%Y%m%d_%H%M%S")
# 拡張子なしの名前と拡張子を組み合わせ
log_name = f"{base_name}_{timestamp}.txt"
return log_name
# 使用例
log_file = create_log_filename("application")
print(f"ログファイル名: {log_file}") # application_20241120_143022.txt
ファイル名のバリデーション
import re
from pathlib import Path
def is_valid_filename(filename):
"""ファイル名が有効かどうかをチェック"""
# Windowsで使用できない文字をチェック
invalid_chars = r'[<>:"/\\|?*]'
if re.search(invalid_chars, filename):
return False
# 予約語をチェック(Windows)
reserved_names = ['CON', 'PRN', 'AUX', 'NUL']
name_only = Path(filename).stem.upper()
if name_only in reserved_names:
return False
return True
# 使用例
filenames = ["report.txt", "data?.csv", "CON.txt", "normal_file.xlsx"]
for name in filenames:
valid = is_valid_filename(name)
print(f"{name}: {'有効' if valid else '無効'}")
まとめ
Pythonでファイル名を取得する方法には、os.path
とpathlib
の2つの主要手段があります。
機能比較表
処理内容 | os.path | pathlib |
---|---|---|
ファイル名の取得 | basename() | .name |
拡張子を除く | splitext()[0] | .stem |
拡張子のみ取得 | splitext()[1] | .suffix |
親ディレクトリ | dirname() | .parent |
パス結合 | join() | / 演算子 |
どちらを選ぶべき?
Python 3.4以降ならpathlib
がおすすめ
- より読みやすいコードが書ける
- オブジェクト指向で直感的
- 多くの機能が統合されている
- クロスプラットフォーム対応が優秀
os.path
が適している場面
- 古いPythonバージョンとの互換性が必要
- 既存のコードとの統一性を保ちたい
- シンプルな処理のみで十分
重要なポイント
- 説明と例を分けて理解する:まず概念を理解してから、具体的なコードで確認
- 実際のファイルで試す:サンプルコードを自分の環境で実行してみる
- エラーハンドリングを忘れずに:ファイルが存在しない場合の処理も考慮する
- 用途に応じて選択:単純な処理なら
os.path
、複雑な処理ならpathlib
コメント