Pythonでファイル名を取得する方法:基本から応用まで一気に解説!

python

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.pathpathlibの2つの主要手段があります。

機能比較表

処理内容os.pathpathlib
ファイル名の取得basename().name
拡張子を除くsplitext()[0].stem
拡張子のみ取得splitext()[1].suffix
親ディレクトリdirname().parent
パス結合join()/ 演算子

どちらを選ぶべき?

Python 3.4以降ならpathlibがおすすめ

  • より読みやすいコードが書ける
  • オブジェクト指向で直感的
  • 多くの機能が統合されている
  • クロスプラットフォーム対応が優秀

os.pathが適している場面

  • 古いPythonバージョンとの互換性が必要
  • 既存のコードとの統一性を保ちたい
  • シンプルな処理のみで十分

重要なポイント

  1. 説明と例を分けて理解する:まず概念を理解してから、具体的なコードで確認
  2. 実際のファイルで試す:サンプルコードを自分の環境で実行してみる
  3. エラーハンドリングを忘れずに:ファイルが存在しない場合の処理も考慮する
  4. 用途に応じて選択:単純な処理ならos.path、複雑な処理ならpathlib

コメント

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