Pythonでファイル名を効率的に取得する方法|osモジュールとpathlibモジュールを徹底解説

1. はじめに

Pythonはファイル操作に関して非常に柔軟であり、シンプルなコードで多くの作業を自動化できます。本記事では、Pythonを使って「ファイル名を取得する」方法をいくつか紹介します。特に、標準ライブラリであるosモジュールやpathlibモジュールを中心に解説します。この記事を読むことで、ディレクトリ内のファイルを効率的に操作し、ファイル名の取得やフィルタリングを行うスクリプトを作成するスキルが身につくでしょう。

2. Pythonでのファイル名取得方法の基本

まずは、Pythonでファイル名を取得するための基本的な方法から始めます。os.path.basename()関数を使用することで、指定したパスからファイル名を取得できます。

2.1 os.path.basename() の使い方

os.path.basename()は、フルパスからファイル名のみを取得する関数です。以下の例では、ファイルパスからファイル名を抽出します。

import os

file_path = "/user/home/document/file.txt"
file_name = os.path.basename(file_path)
print(file_name)  # 結果: "file.txt"

2.2 os.path.dirname()でディレクトリ名を取得

同様に、os.path.dirname()を使うと、ファイルパスからディレクトリ名を取得することができます。これにより、ファイル名とディレクトリ名を分離して取得可能です。

dir_name = os.path.dirname(file_path)
print(dir_name)  # 結果: "/user/home/document"

 

3. ディレクトリ内の全ファイル名を取得する

ディレクトリ内にあるすべてのファイルやフォルダをリスト形式で取得するには、os.listdir()が便利です。また、サブディレクトリ内のファイルを再帰的に取得するためにはos.walk()が役立ちます。

3.1 os.listdir()を使ったファイル名の取得

os.listdir()を使うと、指定したディレクトリ内の全てのファイルとフォルダをリストで取得できます。単純なディレクトリ操作に最適です。

import os

dir_path = "/user/home/document"
files = os.listdir(dir_path)
print(files)  # 結果: ["file1.txt", "file2.txt", "subfolder"]

3.2 os.walk()で再帰的にファイル名を取得

サブディレクトリも含めてファイルを再帰的に取得したい場合は、os.walk()を使うのが最も効果的です。以下のコードでは、指定されたディレクトリとそのサブディレクトリに存在する全ファイルを一覧表示します。

import os

dir_path = "/user/home/document"
for root, dirs, files in os.walk(dir_path):
    for file in files:
        print(os.path.join(root, file))

3.3 エラー処理の追加

ディレクトリが存在しない場合や、アクセス権がない場合にはエラーが発生する可能性があります。そのため、try-exceptを使って例外処理を追加することが推奨されます。

dir_path = "/invalid/path"
try:
    files = os.listdir(dir_path)
    print(files)
except FileNotFoundError:
    print(f"{dir_path}が見つかりません。")

4. 拡張子の取得と変更

ファイル名を取得する際、拡張子の操作も必要になる場合があります。os.path.splitext()を使用することで、拡張子を分離したり、変更したりすることが可能です。

4.1 os.path.splitext()で拡張子を取得

os.path.splitext()は、ファイル名と拡張子を分けて返す関数です。

import os

file_path = "/user/home/document/file.txt"
file_name, file_ext = os.path.splitext(file_path)
print(file_name)  # 結果: "/user/home/document/file"
print(file_ext)   # 結果: ".txt"

4.2 拡張子を変更する

拡張子を変更する際には、os.path.splitext()で取得したファイル名に新しい拡張子を追加します。

new_file_path = file_name + ".jpg"
print(new_file_path)  # 結果: "/user/home/document/file.jpg"

 

5. pathlibモジュールを使ったファイル名取得の応用

Python 3.4以降では、pathlibモジュールがファイルパスの操作に非常に便利です。pathlibはオブジェクト指向の方法でファイルパスを操作でき、より直感的に使用できます。

5.1 Path.iterdir()を使ったファイル名の取得

pathlib.Path()iterdir()メソッドを使うと、指定したディレクトリ内のファイル名とフォルダ名を取得できます。

from pathlib import Path

dir_path = Path("/user/home/document")
for item in dir_path.iterdir():
    print(item.name)

5.2 再帰的なファイル取得: rglob()

サブディレクトリも含めて再帰的にファイル名を取得する場合は、rglob()メソッドを使用します。これは、os.walk()の代替としても利用できます。

for file in dir_path.rglob("*"):
    print(file)

6. ファイル名のフィルタリング

特定の条件に合うファイル名のみを取得したい場合には、globモジュールやpathlibglob()メソッドを使ってフィルタリングが可能です。

6.1 拡張子でのフィルタリング

特定の拡張子を持つファイルのみを取得するには、ワイルドカード*を使います。

from pathlib import Path

dir_path = Path("/user/home/document")
for file in dir_path.glob("*.txt"):
    print(file)

このコードは、指定したディレクトリ内の.txtファイルのみを取得します。

7. まとめ

Pythonを使ってファイル名を取得する方法は多岐にわたりますが、用途に応じて適切な手法を選ぶことが重要です。osモジュールの基本的な操作から、pathlibの高度な機能までを駆使すれば、ディレクトリ内のファイルを効率的に処理できます。次回は、ファイル操作の応用として、ファイルのリネームや移動、削除に関する情報を提供します。