【Python】ファイル名を取得する方法を初心者向けにわかりやすく解説

はじめに

Pythonではテキストファイルや画像ファイルなど、さまざまな種類のファイル名を簡単に取得できます。
例えばフォルダ内のファイルを一括で処理したい場合や、ファイル名を変更しながら整理したい場合に役立ちます。
しかし初心者の方は「どうやってファイル名を一覧で取得すればいいんだろう?」と疑問に思うかもしれません。

ここでは、Pythonを使ってファイル名を取得するための基本的な方法を解説します。
初心者向けにシンプルな言葉で解説しながら、実務で使える具体例や注意点を取り上げます。
ファイル名の取得と一口に言っても、さまざまなシチュエーションがありますので、順番に整理してみましょう。

この記事を読むとわかること

  • Pythonでファイル名を取得する代表的な方法
  • osモジュールやpathlibモジュールの特徴と使い方
  • 実務で使える具体例と注意すべきポイント
  • ファイル名を扱うときのエラー対策や便利なテクニック

これらを理解することで、ファイル操作に関する基本的な処理をスムーズに進めやすくなります。

ファイル名を取得する場面とは?

ファイル名を取得する処理が必要となるのは、どんなときでしょうか。
初心者の皆さんはイメージしづらいかもしれませんが、以下のようなケースが考えられます。

  1. 画像やテキストファイルが大量に入ったフォルダから、ファイル名の一覧を取得したい場合
  2. ファイルパスが含まれる文字列から、ファイル名だけを抜き出したい場合
  3. プログラム内で生成されたファイルを管理するときに、エラーを回避したい場合

これらの場面では、ただファイル名を得るだけではなく、拡張子やフォルダパスをどう扱うかが重要になります。
そのためPythonのメソッドやモジュールを上手に使うことで、コードを読みやすく書くことができます。

多くのプロジェクトでは、ファイルの種類や数が増えたときにこそ効率的な手段が必要です。
例えば、画像処理のパイプラインを組む際に「すべてのJPEGファイルの名前を取得してループ処理する」ということがあります。
またログファイルが大量に生成されるシステムで、指定したフォルダから一括で情報を読み込むケースも少なくありません。

Pythonでファイル名を扱うための基本的なモジュール

Pythonでは、いくつかのモジュールを使ってファイル名を取得できます。
代表的なものとしてはospathlibが挙げられます。
ここでは、それぞれどんな特徴があるのかを見ていきます。

osモジュール

osモジュールは、Pythonでファイル操作やディレクトリ操作をする際に昔からよく使われているものです。
ファイル名を取得したり、フォルダを作成したり、環境変数にアクセスしたりする機能が含まれています。
os.listdir()os.pathを使うことで、簡単にファイル名の一覧を取得できます。
歴史が長く、情報が多いのも特徴といえます。

pathlibモジュール

pathlibモジュールは、より直感的にパスを扱えるように設計されています。
オブジェクト指向的な書き方が特徴で、ファイルパスを表すPathクラスを使うことで、コードの可読性が高くなりやすいです。
globやさまざまなメソッドが用意されているため、複雑なパス操作が必要なときにも役立ちます。

開発現場では、従来のosモジュールに慣れている方はそちらを使い続けるパターンもあります。
一方で、新しいプロジェクトではpathlibを選ぶケースも多いです。
どちらを使うかはプロジェクトやチームの方針によって異なるでしょう。

osモジュールを使ったファイル名取得

ではまず、osモジュールを使ったファイル名の取得方法を見てみましょう。
最初に思い浮かぶのはos.listdir()です。
指定したディレクトリ内のファイルやフォルダをリスト形式で取得できます。

os.listdir()の基本的な使い方

次の例では、同じフォルダ内にあるディレクトリ「sample_dir」からファイル名を一覧で取得しています。

import os

folder_path = "sample_dir"
file_list = os.listdir(folder_path)

print(file_list)

このコードを実行すると、file_listには文字列のリストが返されます。
「image1.jpg」「image2.jpg」「notes.txt」など、ディレクトリ配下にあるすべてのファイルやフォルダ名が格納されます。
実務で利用する際、ファイルの拡張子をチェックしてから処理を分岐させることも多いです。

os.path.join()でパスを結合する

ファイルパスを組み立てるときには、単純に文字列を連結するとOSによるパス区切り文字(/\)の違いに引っかかる可能性があります。
そのため、ファイルパスを安全に扱うためにos.path.join()を使う方法があります。
例えば以下のように書きます。

import os

folder_path = "sample_dir"
for file_name in os.listdir(folder_path):
    full_path = os.path.join(folder_path, file_name)
    print(full_path)

os.path.join()を使うことで、OSごとのパス区切りを気にせずに書けます。
実務でもパス結合を正しく行わないと「ファイルが見つからない」「パスが通らない」といったエラーに悩むことがあります。
この関数を使うと、そういったリスクを抑えやすいでしょう。

os.path.basename()でファイル名だけを取得する

場合によっては、フルパスからファイル名だけを抜き出したいことがあります。
そんなときにはos.path.basename()が使えます。
以下は例です。

import os

full_path = "/path/to/something/data.csv"
file_name = os.path.basename(full_path)

print(file_name)  # 結果: data.csv

これで取得できるのは「data.csv」という文字列だけです。
もし拡張子を外したいなら、後述するos.path.splitext()を利用する方法が便利です。

pathlibモジュールを使ったファイル名取得

次に、pathlibを利用したファイル名取得の方法を見ていきましょう。
このモジュールではPathオブジェクトを使うことで、コードが直感的に書きやすいという特徴があります。

Pathオブジェクトの基本

pathlibを使うときは、まずPathをインポートします。

from pathlib import Path

folder_path = Path("sample_dir")
for file_path in folder_path.iterdir():
    print(file_path)

folder_path.iterdir()を呼ぶことで、folder_pathに含まれているファイルやサブフォルダを順番に取得できます。
file_pathはPathオブジェクトになっているため、文字列を直接操作するよりも安全で読みやすいです。

Pathオブジェクトからファイル名だけ抜き出す

Pathオブジェクトが持つプロパティやメソッドを活用すると、コードの可読性が上がります。
例えばファイル名だけを取得するには、nameプロパティやstemプロパティを使うことができます。

from pathlib import Path

file_path = Path("/path/to/something/data.csv")
print(file_path.name)  # data.csv
print(file_path.stem)  # data
print(file_path.suffix)  # .csv
  • name : フルパスからファイル名を含む末尾部分を返す
  • stem : 拡張子を除いたファイル名を返す
  • suffix : 拡張子を返す

実務でファイル操作をするときは、拡張子ごとに処理を切り分けることもよくあります。
例えば「.csv」のファイルだけを扱いたい、というケースが典型的です。
Pathオブジェクトならfile_path.suffix == ".csv"のように比較できます。

glob()を使ったファイル検索

特定のパターンに合うファイルだけを取得したい場合、Path.glob()Path.rglob()を利用すると便利です。
次のような例があります。

from pathlib import Path

folder_path = Path("sample_dir")

# sample_dir直下にある.csvファイルを取得
for file_path in folder_path.glob("*.csv"):
    print(file_path.name)

# sample_dir配下を再帰的にすべて検索
for file_path in folder_path.rglob("*.txt"):
    print(file_path.name)

ここでは、glob("*.csv")で拡張子が.csvのファイルをすべて検索しています。
rglob()を使うと、サブフォルダまで含めて再帰的に検索してくれます。
大量のファイルがあるプロジェクトで、一括でファイル名を集める場合に役立ちます。

実務で使うシーンを具体的にイメージする

ここからは、ファイル名の取得をどう実務に結びつけて考えるかをもう少し掘り下げてみましょう。
単にファイル名を集めるだけではなく、取得したファイル名をどう活かすかが重要です。

画像ファイルを自動でリネームする

例えば、商品画像がたくさん入ったフォルダ内のファイルを一括でリネームしたい場合があります。
そんなときは、まずファイル名の一覧を取得し、繰り返し処理で新しい名前に変更していくわけです。

import os

folder_path = "images"
new_name_prefix = "product_"

for idx, file_name in enumerate(os.listdir(folder_path), start=1):
    old_path = os.path.join(folder_path, file_name)
    ext = os.path.splitext(file_name)[1]
    new_path = os.path.join(folder_path, f"{new_name_prefix}{idx}{ext}")
    os.rename(old_path, new_path)

この例では、imagesフォルダ内にあるファイルを列挙し、product_1.jpgなどの形式にまとめています。
ファイル名を取得できると、こうしたリネーム作業が簡単になるでしょう。

データ解析で必要なファイルだけを集めて読み込む

データ解析の現場では「.csv」や「.txt」のようなテキストデータだけを取り出して、まとめて処理したいことがあります。
そこで、前述のglob機能を使い、特定の拡張子のファイルだけを選り分けることができます。

from pathlib import Path

folder_path = Path("dataset")

# 全ての.csvファイルを収集し、中身を処理
csv_files = list(folder_path.glob("*.csv"))

for csv_file in csv_files:
    print(csv_file.name)
    # ここでcsv_fileを読み込み、分析するなどの処理を行う

このように書くと、決められたフォルダ配下の「.csv」だけを対象にループ処理ができます。
もしサブディレクトリも含めて探したいなら、rglob("*.csv")を使います。
ファイル名を正しく取得できれば、読み込み漏れやデータの取り違えを防ぎやすいです。

ファイル名取得時に発生しがちなエラーと対処

ファイル名の取得に関して、初心者がつまずくポイントはいくつかあります。
ここでは代表的なエラーと、その対処法を簡単にまとめます。

パスが間違っていて「ファイルが見つからない」

絶対パスなのか相対パスなのかを間違えたり、フォルダ名をタイプミスしたりすると、ファイルが見つからないエラーが起こりがちです。
そんなときは、まずパスが正しいかを確認してみてください。
一時的にprint()などでos.getcwd()(現在の作業ディレクトリ)を確認し、期待しているディレクトリと一致しているか確認してみるとヒントになります。

ファイルだけでなくディレクトリも取得してしまう

os.listdir()folder_path.iterdir()は、ファイルとフォルダの両方を取得します。
ファイルだけを対象にしたいなら、ループの中で「ディレクトリなのかファイルなのか」を判定する処理が必要です。

import os

folder_path = "sample_dir"

for item in os.listdir(folder_path):
    full_item_path = os.path.join(folder_path, item)
    if os.path.isfile(full_item_path):
        print("File:", item)
    else:
        print("Directory:", item)

実務では、サブディレクトリが多数存在するケースもあるので、この判定をうまく使い分けるとエラーを減らしやすいです。

日本語ファイル名に関する文字化けやエンコードの問題

日本語ファイル名を扱うとき、環境によっては文字化けやエンコードの問題が発生することがあります。
最近のPython環境では大きな問題になるケースは少ないですが、プロジェクトやOSごとに取り扱いが違う場合があります。
もし文字化けが起こる場合は、エディタや端末の文字コード設定を見直すとよいでしょう。

日本語ファイル名は環境依存のトラブルを招くことがあります。
プロジェクトでファイル名に日本語を使う場合は、チームで命名ルールを共有するのも一つの方法です。

コマンドライン引数からファイル名を取得する方法

Pythonのスクリプトにコマンドライン引数を渡して、そのファイル名を取得したい場面もあるかもしれません。
例えば、コマンドラインでpython script.py data.txtと実行して、data.txtのファイル名を受け取りたい場合です。

import sys

if len(sys.argv) < 2:
    print("ファイル名を指定してください")
else:
    file_name = sys.argv[1]
    print(f"指定されたファイル名: {file_name}")

このスクリプトをscript.pyというファイル名で保存したとします。
その後、ターミナルでpython script.py data.txtと入力すると、コマンドラインの引数として「data.txt」がsys.argv[1]に格納されます。
ファイルを一度に複数渡したい場合は、sys.argv[2]sys.argv[3]などを活用することもできます。

WindowsとLinux/Macでのパスの違いに注意

WindowsとLinux(またはMac)では、パスの区切り文字が異なります。
Windowsでは\(バックスラッシュ)、LinuxやMacでは/(スラッシュ)が使われます。
この違いによって、文字列を単純に結合したり分割したりすると、不具合が生じるケースがあります。

そういった問題を避けるためには、os.path.join()pathlib.Pathのようなパス操作に対応したメソッドやクラスを使うのがおすすめです。
文字列として手動で/を追加するような方法は、なるべく避ける方がよいでしょう。

Windows特有のドライブ名(例:C:\)や、ネットワークドライブを扱う場合はパスの指定方法がさらに複雑になることがあります。
プロジェクトの環境に合わせてテストを行っておくと、思わぬエラーを回避しやすいです。

ファイル名と拡張子の分離方法

ファイル名を取得するとき、拡張子を分離したいケースはよくあります。
特定の拡張子でなければ処理をしないようにしたり、拡張子だけを変更したりするときに便利です。

os.path.splitext() の例

os.path.splitext()は、ファイル名やフルパスを渡すと拡張子手前までと拡張子部分に分割して返します。

import os

file_name = "data.csv"
name_without_ext, file_ext = os.path.splitext(file_name)

print(name_without_ext)  # data
print(file_ext)          # .csv

これを応用すると、複数ファイルを扱う際に「.txtだけ対象にする」「.csvに変換する」といった処理が簡単になります。

Pathオブジェクトの場合

pathlib.Pathを使う場合にはstemsuffixを組み合わせると同様のことができます。
直感的な書き方なので、コードの可読性が上がるでしょう。

from pathlib import Path

file_path = Path("example.json")
print(file_path.stem)   # example
print(file_path.suffix) # .json

実際の運用においては、ファイルの拡張子チェックや名前の整形などをまとめて関数化すると保守性が高まります。

ファイル名だけを再構成して整理する応用例

ファイル名を取得したら、それを使って新しいパスを生成したり、まとめてコピーしたりする処理を行うかもしれません。
ここでは、一括でファイルをまとめて別のディレクトリに移動する流れを例として挙げてみます。

import os
import shutil

source_folder = "source_data"
dest_folder = "backup"

os.makedirs(dest_folder, exist_ok=True)
for item in os.listdir(source_folder):
    old_path = os.path.join(source_folder, item)
    if os.path.isfile(old_path):
        new_path = os.path.join(dest_folder, item)
        shutil.copy2(old_path, new_path)
        # ファイル名はそのままだが、別フォルダにコピーする

shutilモジュールを使うとコピーや移動がスムーズに書けます。
ファイル名だけでなくフォルダのパスも操作が必要になるので、os.pathshutilを合わせて使うことで、一連の処理を実装しやすくなります。

ファイル名と文字列操作の活用

取得したファイル名をさらに加工したいケースもあるでしょう。
「2023-01-01_ログ.txt」というファイル名から日付だけを取り出すなど、ファイル名を文字列として扱う場合です。
例えば以下のようなやり方があります。

file_name = "2023-01-01_ログ.txt"

if "_" in file_name:
    date_part, description = file_name.split("_", 1)
    # date_part -> "2023-01-01"
    # description -> "ログ.txt"
    print(date_part, description)

このように、アンダースコアやハイフンといった区切り文字を使うことで、ファイル名にメタ情報を埋め込んでおき、プログラム側で簡単に取り出せます。
実務ではログファイルや日付付きファイル名が多いため、文字列操作を覚えておくと応用が効くでしょう。

大量のファイルを処理するときのパフォーマンス

大量のファイルがあるディレクトリでファイル名を取得して、繰り返し処理を行うときは、処理速度が気になることがあります。
一般的な数千~数万ファイル程度であれば、Pythonのlistdir()iterdir()で問題なく処理できるケースが多いです。
ただし、数十万単位など極端に多い場合は、I/Oがボトルネックになる可能性があります。

そのようなときは、なるべく無駄な再帰呼び出しやファイルアクセスを避けたり、一括取得後にメモリ内で必要な情報だけを抽出したりといった工夫を検討しましょう。
また、ネットワークドライブ上のファイルだとアクセス速度が遅くなる場合があるので注意が必要です。

テキストファイルからファイル名のリストを読み込む

システムによっては、外部ファイルに書かれたファイル名リストを読み込み、それをもとに処理を行うことがあります。
以下のようにして、テキストファイルからファイル名を一行ずつ取得し、それぞれに対して何かの操作を行うイメージです。

file_with_names = "file_list.txt"

with open(file_with_names, "r", encoding="utf-8") as f:
    lines = f.read().splitlines()

for file_name in lines:
    # ここでfile_nameに対して操作をする
    print(file_name)

このスクリプトでは、あらかじめ用意されたfile_list.txtの中に、行ごとに「example1.csv」「example2.csv」のようなファイル名が並んでいる想定です。
こうした手法は、外部からファイル名のリストを受け取ってバッチ処理を行う場合に役立ちます。

まとめ

ファイル名の取得は、Pythonを使いこなすうえで重要な基本技術の一つです。
ディレクトリ内のファイル名を一覧で取る場面や、特定のパターンのファイルだけを集める場面は多くのプロジェクトで発生します。
osモジュールやpathlibモジュールを使い分けることで、状況に応じて柔軟にファイル操作が行えます。

また、ファイル名には拡張子や日付などの情報が入っていることが多く、上手に抽出すると処理の効率が高まります。
実務では、こうした基礎知識を応用して大量のファイルを自動でリネームしたり、定期的にバックアップを取ったりといったことが可能になります。

初心者の皆さんは、まずは自分のPC上で簡単なフォルダを作り、その中にファイルを配置してからPythonコードで名前を取得してみると良いかもしれません。
徐々に慣れていけば、もっと大規模な処理にも抵抗なく取り組めるようになるでしょう。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。