Pythonでフォルダ内のファイル名を取得する方法|初心者でもわかる完全ガイド

目次

1. はじめに

Pythonでフォルダ内のファイル名を取得する方法は、プログラミング初心者から中級者にとって非常に有用なスキルです。ファイル名を取得することで、大量のデータ処理やファイル操作を効率化できるため、業務の自動化やデータ整理に役立ちます。

この記事では、Pythonを使ったフォルダ内のファイル名取得方法を段階的に解説します。初めて学ぶ方でも実践できるよう、コード例を交えてわかりやすく説明します。

2. osモジュールを使った基本的なファイル名取得方法

Python標準ライブラリのosモジュールを使用すれば、フォルダ内のファイル名を簡単に取得できます。この方法は、Pythonを初めて使う方にも適しており、シンプルで直感的なコード構造が特徴です。

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

os.listdir()は、指定したディレクトリ内のすべての項目(ファイルやフォルダ)の名前をリストとして返します。

import os

# フォルダ内のファイルとディレクトリを取得
folder_path = "sample_folder"
items = os.listdir(folder_path)

print("フォルダ内の項目:")
print(items)

上記のコードを実行すると、指定したフォルダ内のファイル名とディレクトリ名がリスト形式で表示されます。

ファイル名のみを抽出する方法

取得したリストには、ディレクトリ名も含まれることがあります。os.path.isfile()を使うことで、ファイルのみを抽出することが可能です。

import os

# フォルダ内のファイル名のみを取得
folder_path = "sample_folder"
files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]

print("フォルダ内のファイル:")
print(files)

このコードでは、各項目がファイルであるかをチェックして、ファイル名のみをリストに格納しています。

使用例

例えば、あるフォルダ内に保存された画像ファイルのリストを作成したい場合、以下のように活用できます。

import os

# 画像ファイルを取得
folder_path = "images"
image_files = [f for f in os.listdir(folder_path) if f.endswith((".png", ".jpg", ".jpeg"))]

print("画像ファイル一覧:")
print(image_files)

この方法の利点

  • シンプルで分かりやすい。
  • Python標準ライブラリだけで実装可能。
  • 小規模なフォルダ内のファイル操作に最適。

注意点

  • 隠しファイルや特殊なファイル名が含まれる場合があるため、必要に応じてフィルタリングを行う必要があります。
  • 大規模なディレクトリで使用するとパフォーマンスに影響を及ぼす可能性があります。
侍エンジニア塾

3. ワイルドカード検索が可能なglobモジュールの活用

Pythonのglobモジュールを使えば、特定のパターンに一致するファイル名を効率的に取得できます。osモジュールと異なり、ワイルドカードを利用してファイル名の検索条件を柔軟に設定できるのが特徴です。

globモジュールの基本的な使い方

glob.glob()を使うことで、指定したパターンに一致するファイルやフォルダを取得できます。

import glob

# フォルダ内のすべてのファイルを取得
folder_path = "sample_folder"
files = glob.glob(f"{folder_path}/*")

print("フォルダ内のファイル:")
print(files)

このコードでは、指定したフォルダ内のすべての項目(ファイルやフォルダ)のパスが取得されます。

特定のパターンに一致するファイルを取得

例えば、特定の拡張子を持つファイルだけを取得する場合は以下のように記述します。

import glob

# 指定した拡張子のファイルを取得
folder_path = "sample_folder"
text_files = glob.glob(f"{folder_path}/*.txt")

print("テキストファイル一覧:")
print(text_files)

この例では、.txt拡張子を持つファイルだけが取得されます。同様に、複数の拡張子を指定したい場合は以下のように記述します。

import glob

# 複数の拡張子を指定してファイルを取得
folder_path = "sample_folder"
files = glob.glob(f"{folder_path}/*.txt") + glob.glob(f"{folder_path}/*.csv")

print("テキストとCSVファイル一覧:")
print(files)

再帰的にファイルを取得

globモジュールのrecursive=Trueオプションを使用することで、サブディレクトリ内のファイルも含めて取得できます。

import glob

# サブディレクトリ内のすべてのファイルを再帰的に取得
folder_path = "sample_folder"
files = glob.glob(f"{folder_path}/**/*", recursive=True)

print("サブディレクトリ内のすべてのファイル:")
print(files)

ワイルドカードの使用例

  • *:任意の文字列を表す。
  • ?:任意の1文字を表す。
  • [abc]:括弧内の任意の文字を表す。
import glob

# ファイル名が"data"で始まる任意のファイルを取得
folder_path = "sample_folder"
files = glob.glob(f"{folder_path}/data*")

print("dataで始まるファイル一覧:")
print(files)

利点と用途

  • 柔軟なパターン指定が可能で、ファイル名の検索に特化している。
  • osモジュールと比較して、コードが簡潔になる。
  • 再帰検索が簡単に行える。

注意点

  • パターンに一致しない場合は空のリストが返されるため、結果の確認が必要です。
  • 再帰検索で膨大な数のファイルが取得される可能性があるため、適切にフィルタリングすることを推奨します。

4. オブジェクト指向的に操作するpathlibモジュール

Pythonのpathlibモジュールは、ファイルパスの操作をオブジェクト指向で扱えるようにした、モダンで直感的な方法です。これにより、コードの可読性が向上し、操作がよりシンプルになります。

pathlibモジュールの基本的な使い方

pathlibモジュールのPathオブジェクトを使用すると、ディレクトリ内の項目を簡単に取得できます。

from pathlib import Path

# フォルダ内の項目を取得
folder_path = Path("sample_folder")
items = list(folder_path.iterdir())

print("フォルダ内の項目:")
print(items)

このコードでは、フォルダ内のすべての項目(ファイルやフォルダ)がPathオブジェクトのリストとして返されます。

ファイル名のみを抽出

フォルダ内の項目からファイルだけを取得するには、is_file()メソッドを使用します。

from pathlib import Path

# フォルダ内のファイルを取得
folder_path = Path("sample_folder")
files = [f for f in folder_path.iterdir() if f.is_file()]

print("フォルダ内のファイル:")
print(files)

このコードでは、ディレクトリは除外され、ファイルのみがリストに格納されます。

拡張子でフィルタリング

特定の拡張子を持つファイルだけを取得するには、拡張子を条件として指定します。

from pathlib import Path

# フォルダ内の特定拡張子を持つファイルを取得
folder_path = Path("sample_folder")
text_files = [f for f in folder_path.iterdir() if f.is_file() and f.suffix == ".txt"]

print("テキストファイル:")
print(text_files)

suffix属性を使うことで、ファイルの拡張子を簡単に取得できます。

再帰的にファイルを取得

サブディレクトリ内のファイルも含めて取得する場合は、rglob()メソッドを使用します。

from pathlib import Path

# サブディレクトリ内のすべてのファイルを取得
folder_path = Path("sample_folder")
files = list(folder_path.rglob("*"))

print("サブディレクトリ内のすべてのファイル:")
print(files)

さらに、特定のパターンに一致するファイルを再帰的に検索することも可能です。

from pathlib import Path

# サブディレクトリ内の特定拡張子を持つファイルを取得
folder_path = Path("sample_folder")
text_files = list(folder_path.rglob("*.txt"))

print("再帰的に取得したテキストファイル:")
print(text_files)

利点と用途

  • オブジェクト指向で直感的なコードが書ける。
  • 再帰的な操作やフィルタリングが簡単に実現できる。
  • Python 3.4以降で使用可能で、最新のPythonでは推奨されるモジュール。

注意点

  • サポートされていないPythonのバージョン(3.4未満)では使用できません。
  • 大規模なディレクトリ操作ではパフォーマンスに注意が必要です。
侍エンジニア塾

5. サブディレクトリ内のファイルを再帰的に取得する方法

フォルダ内のファイルを取得する際、サブディレクトリにあるファイルも含めて再帰的に取得したい場合があります。このセクションでは、osモジュールとその他の方法を使って、再帰的にファイルを取得する手法を解説します。

os.walk()を使った方法

os.walk()は、指定したディレクトリとそのサブディレクトリ内を再帰的に探索し、フォルダ名、サブフォルダ名、ファイル名を取得できます。

import os

# サブディレクトリ内のすべてのファイルを取得
folder_path = "sample_folder"

for root, dirs, files in os.walk(folder_path):
    for file in files:
        print(f"ファイル: {os.path.join(root, file)}")

コードの説明

  • os.walk()は、(フォルダパス, サブフォルダリスト, ファイルリスト)をタプルとして返します。
  • os.path.join()を使って、ファイルのフルパスを作成しています。

ファイルリストをまとめて取得

取得したすべてのファイルをリストに格納したい場合は、以下のように書けます。

import os

# サブディレクトリ内のすべてのファイルをリストに格納
folder_path = "sample_folder"
all_files = []

for root, dirs, files in os.walk(folder_path):
    for file in files:
        all_files.append(os.path.join(root, file))

print("サブディレクトリ内のすべてのファイル:")
print(all_files)

特定の拡張子を持つファイルのみ取得

例えば、.txtファイルだけを取得したい場合、次のように条件を追加します。

import os

# サブディレクトリ内の特定の拡張子を持つファイルを取得
folder_path = "sample_folder"
txt_files = []

for root, dirs, files in os.walk(folder_path):
    for file in files:
        if file.endswith(".txt"):
            txt_files.append(os.path.join(root, file))

print("テキストファイル:")
print(txt_files)

globモジュールを使った再帰的な取得

globモジュールの**を使えば、簡単に再帰的な検索が可能です。

import glob

# 再帰的にすべてのファイルを取得
folder_path = "sample_folder"
all_files = glob.glob(f"{folder_path}/**/*", recursive=True)

print("再帰的に取得したファイル:")
print(all_files)

また、特定の拡張子を持つファイルのみを取得したい場合も簡単です。

import glob

# 再帰的に特定の拡張子を持つファイルを取得
folder_path = "sample_folder"
txt_files = glob.glob(f"{folder_path}/**/*.txt", recursive=True)

print("再帰的に取得したテキストファイル:")
print(txt_files)

pathlibモジュールを使った再帰的な取得

pathlibモジュールのrglob()メソッドは、再帰的なファイル取得を直感的に実現できます。

from pathlib import Path

# 再帰的にすべてのファイルを取得
folder_path = Path("sample_folder")
all_files = list(folder_path.rglob("*"))

print("再帰的に取得したファイル:")
print(all_files)

特定の拡張子を指定する場合も簡単です。

from pathlib import Path

# 再帰的に特定の拡張子を持つファイルを取得
folder_path = Path("sample_folder")
txt_files = list(folder_path.rglob("*.txt"))

print("再帰的に取得したテキストファイル:")
print(txt_files)

各方法の比較

方法特徴利点注意点
os.walk()再帰的なファイル探索を手動で実装カスタマイズ性が高いコードが長くなることがある
globワイルドカードを使った簡潔な記述が可能再帰的な検索を短いコードで実現可能ワイルドカードパターンの設計が必要
pathlib.rglob()オブジェクト指向的でPythonicな書き方が可能可読性が高く、最新のPythonコードに適合Python 3.4以降でのみ利用可能

 

6. 特定条件でのファイル名フィルタリングと応用例

特定の条件でファイルをフィルタリングすることは、取得したファイル名リストを整理し、目的に応じたデータ操作を行う際に役立ちます。このセクションでは、Pythonを使って拡張子やファイル名、さらには正規表現を活用してファイルを絞り込む方法を解説します。

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

指定した拡張子のファイルのみを取得したい場合、リスト内包表記や条件分岐を利用します。

例: osモジュールを使用

import os

# 指定した拡張子のファイルを取得
folder_path = "sample_folder"
txt_files = [f for f in os.listdir(folder_path) if f.endswith(".txt")]

print("テキストファイル:")
print(txt_files)

例: pathlibモジュールを使用

pathlibモジュールを使用すると、拡張子のフィルタリングがさらに簡潔に記述できます。

from pathlib import Path

# 拡張子が.txtのファイルを取得
folder_path = Path("sample_folder")
txt_files = [f for f in folder_path.iterdir() if f.suffix == ".txt"]

print("テキストファイル:")
print(txt_files)

ファイル名に特定の文字列を含む場合

特定の文字列がファイル名に含まれているかを判定するには、in演算子を使います。

import os

# ファイル名に"report"を含むファイルを取得
folder_path = "sample_folder"
report_files = [f for f in os.listdir(folder_path) if "report" in f]

print("reportを含むファイル:")
print(report_files)

正規表現を使った高度なフィルタリング

正規表現を使えば、より柔軟な条件でファイルをフィルタリングできます。例えば、ファイル名の特定のパターンを探す場合に有用です。

import os
import re

# ファイル名が数字のみで構成されたファイルを取得
folder_path = "sample_folder"
pattern = re.compile(r"^\d+$")

files = [f for f in os.listdir(folder_path) if pattern.match(f)]

print("数字のみのファイル名:")
print(files)

ファイルサイズでフィルタリング

ファイルのサイズを条件にフィルタリングしたい場合は、os.path.getsize()を利用します。

import os

# サイズが1MB以上のファイルを取得
folder_path = "sample_folder"
large_files = [f for f in os.listdir(folder_path) if os.path.getsize(os.path.join(folder_path, f)) > 1 * 1024 * 1024]

print("1MB以上のファイル:")
print(large_files)

応用例

1. 拡張子で分類する

複数の拡張子を持つファイルを分類したい場合、以下のように書けます。

import os

# ファイルを拡張子で分類
folder_path = "sample_folder"
files_by_extension = {}

for f in os.listdir(folder_path):
    ext = os.path.splitext(f)[1]  # 拡張子を取得
    if ext not in files_by_extension:
        files_by_extension[ext] = []
    files_by_extension[ext].append(f)

print("拡張子ごとの分類:")
print(files_by_extension)

2. 日付で絞り込む

ファイルの更新日時を基準にフィルタリングするには、os.path.getmtime()を使用します。

import os
import time

# 一週間以内に更新されたファイルを取得
folder_path = "sample_folder"
one_week_ago = time.time() - 7 * 24 * 60 * 60

recent_files = [f for f in os.listdir(folder_path) if os.path.getmtime(os.path.join(folder_path, f)) > one_week_ago]

print("最近更新されたファイル:")
print(recent_files)

各方法の用途と利便性

フィルタリング条件使用方法用途
拡張子f.endswith(".txt")ファイルの種類で分類する
特定文字列"keyword" in f特定の用途に関連するファイルを探す
正規表現re.match(pattern, f)複雑な名前パターンのファイルを検索
ファイルサイズos.path.getsize()大容量ファイルの検出
更新日時os.path.getmtime()最近使用されたファイルを見つける

 

7. 実践例:取得したファイル名リストの使い方

取得したファイル名リストをどのように活用するかは、用途や目的に応じて多岐にわたります。このセクションでは、一般的な活用シナリオと具体的なコード例をいくつか紹介します。

ファイル内容の一括処理

取得したファイルリストを用いて、各ファイルの内容を読み込んで処理する例を示します。

例:テキストファイルの内容をまとめて読み込む

import os

# フォルダ内のテキストファイルを取得
folder_path = "sample_folder"
text_files = [f for f in os.listdir(folder_path) if f.endswith(".txt")]

# ファイル内容をまとめて読み込む
all_content = ""
for file in text_files:
    with open(os.path.join(folder_path, file), "r", encoding="utf-8") as f:
        all_content += f.read() + "
"

print("すべてのテキストファイルの内容:")
print(all_content)

ファイルのリネーム

取得したファイル名リストを利用して、一括でファイルをリネームすることが可能です。

例:ファイル名にプレフィックスを追加する

import os

# フォルダ内のファイルを取得
folder_path = "sample_folder"
files = os.listdir(folder_path)

# ファイル名にプレフィックスを追加
for file in files:
    old_path = os.path.join(folder_path, file)
    new_path = os.path.join(folder_path, f"new_{file}")
    os.rename(old_path, new_path)

print("ファイル名を変更しました。")

ファイルリストの保存

取得したファイル名リストを外部ファイル(テキストファイルやExcel)に保存して、後から確認できるようにすることも便利です。

例:ファイル名リストをテキストファイルに保存する

import os

# フォルダ内のファイルを取得
folder_path = "sample_folder"
files = os.listdir(folder_path)

# ファイル名をテキストファイルに保存
with open("file_list.txt", "w", encoding="utf-8") as f:
    for file in files:
        f.write(file + "
")

print("ファイル名リストを保存しました。")

例:ファイル名リストをCSVに保存する

import os
import csv

# フォルダ内のファイルを取得
folder_path = "sample_folder"
files = os.listdir(folder_path)

# ファイル名をCSVに保存
with open("file_list.csv", "w", encoding="utf-8", newline="") as csvfile:
    writer = csv.writer(csvfile)
    writer.writerow(["ファイル名"])  # ヘッダーを追加
    for file in files:
        writer.writerow([file])

print("ファイル名リストをCSVに保存しました。")

ファイルのバックアップ作成

ファイル名リストを利用して、指定したフォルダにファイルのバックアップを作成する例です。

import os
import shutil

# フォルダ内のファイルを取得
source_folder = "sample_folder"
backup_folder = "backup_folder"
os.makedirs(backup_folder, exist_ok=True)

files = os.listdir(source_folder)

# ファイルをバックアップフォルダにコピー
for file in files:
    shutil.copy(os.path.join(source_folder, file), os.path.join(backup_folder, file))

print("バックアップを作成しました。")

特定のファイルに処理を限定する

取得したファイルリストを使って、特定の条件を満たすファイルに対してのみ処理を実行します。

例:特定の拡張子を持つファイルの削除

import os

# フォルダ内の特定の拡張子を持つファイルを削除
folder_path = "sample_folder"
files = [f for f in os.listdir(folder_path) if f.endswith(".tmp")]

for file in files:
    os.remove(os.path.join(folder_path, file))

print("不要なファイルを削除しました。")

応用シナリオ

  • データ収集:大量のCSVファイルを取得して、データを統合。
  • ログ管理:古いログファイルを特定して削除。
  • 画像処理:特定のフォルダ内の画像に対してリサイズや変換を実施。

8. トラブルシューティング:エラー解消のヒント

ファイル操作やフォルダ内のファイル名取得を行う際には、さまざまなエラーが発生する可能性があります。このセクションでは、よくあるエラーとその解決方法を解説します。

エラー1: フォルダが見つからない

発生状況
指定したフォルダが存在しない場合、FileNotFoundErrorが発生します。

原因

  • フォルダパスが間違っている。
  • フォルダが削除されている。

対処方法

  • os.path.exists()pathlib.Path.exists()でフォルダが存在するか確認します。

例: フォルダが存在するか確認するコード

import os

folder_path = "sample_folder"

if not os.path.exists(folder_path):
    print(f"エラー: フォルダが見つかりません ({folder_path})")
else:
    print("フォルダが存在します。")

エラー2: ファイル操作時の権限エラー

発生状況
ファイルの読み取りや書き込みを試みた際に、PermissionErrorが発生します。

原因

  • ファイルまたはフォルダにアクセス権がない。
  • ファイルが他のプロセスによってロックされている。

対処方法

  • アクセス権限を確認して修正します。
  • ファイルが使用中でないか確認します。

例: アクセス権エラーの処理

import os

file_path = "sample_folder/sample_file.txt"

try:
    with open(file_path, "r", encoding="utf-8") as f:
        content = f.read()
        print(content)
except PermissionError:
    print(f"エラー: ファイルにアクセスする権限がありません ({file_path})")

エラー3: ファイルパスが長すぎる

発生状況
Windows環境では、パスが260文字を超える場合にエラーが発生することがあります。

対処方法

  • Windowsで「長いパス」をサポートする設定を有効化します。
  • ファイルやフォルダ名を短縮します。

例: パスを短縮するコード

import os

# 長いパスを短縮
long_path = "a/very/long/path/to/a/folder/with/a/long/file_name.txt"
short_path = os.path.basename(long_path)
print(f"短縮パス: {short_path}")

エラー4: 特殊文字を含むファイル名の処理

発生状況
ファイル名に特殊文字(例: 空白、特殊記号、非ASCII文字)が含まれる場合、エラーが発生することがあります。

対処方法

  • ファイル名を正規化します。
  • 非ASCII文字を削除または置換します。

例: ファイル名を正規化するコード

import os

file_path = "sample_folder/サンプル file!.txt"
normalized_file_path = file_path.replace(" ", "_").replace("!", "")
print(f"正規化されたファイル名: {normalized_file_path}")

エラー5: メモリ不足エラー

発生状況
非常に大規模なディレクトリを処理する際、メモリが不足してエラーが発生することがあります。

対処方法

  • ファイルを一括処理するのではなく、少量ずつ分割して処理します。
  • ファイルリストを生成する際にジェネレータを使用します。

例: ジェネレータを使用した処理

import os

def get_files(folder_path):
    for root, _, files in os.walk(folder_path):
        for file in files:
            yield os.path.join(root, file)

folder_path = "sample_folder"
for file in get_files(folder_path):
    print(f"処理中: {file}")

エラー6: ファイルがロックされている

発生状況
特定のアプリケーションがファイルを開いているため、削除や編集ができない場合があります。

対処方法

  • ファイルを使用しているプロセスを特定して終了します。
  • ファイルが解放されるまで待機します。

エラー7: UnicodeDecodeError

発生状況
ファイルのエンコーディングが不明な場合に発生します。

対処方法

  • エンコーディングを指定してファイルを開きます。
  • chardetライブラリを使用してエンコーディングを検出します。

例: エンコーディングを指定してファイルを開く

import os

file_path = "sample_folder/sample_file.txt"

try:
    with open(file_path, "r", encoding="utf-8") as f:
        content = f.read()
        print(content)
except UnicodeDecodeError:
    print(f"エラー: ファイルのエンコーディングが不明です ({file_path})")

まとめ

これらのトラブルシューティングを活用することで、ファイル操作時に発生するエラーを効率的に解消し、スクリプトの信頼性を向上させることができます。

9. まとめ

この記事では、Pythonを使ってフォルダ内のファイル名を取得する方法を基礎から応用まで解説しました。それぞれの手法の特徴や適用場面を振り返り、どの方法を選ぶべきかをまとめます。

使用した手法の特徴と使い分け

手法特徴適用場面
osモジュール– 標準ライブラリの一部で手軽に使用可能。小規模なフォルダの処理や基本的なファイル取得に最適。
 – 再帰的な検索にはos.walk()を使用。サブディレクトリも含めたファイル操作が必要な場合。
globモジュール– ワイルドカードによる柔軟なパターン検索が可能。拡張子や名前の条件付き検索を効率的に行いたい場合。
 recursive=Trueで再帰的検索が可能。サブディレクトリ内の特定条件に合致するファイル検索。
pathlibモジュール– オブジェクト指向でモダンな記述が可能。Python 3.4以降を使用しており、可読性が求められる場合。
 rglob()で再帰的かつ直感的にファイルを検索可能。サブディレクトリを含むフォルダ操作を簡潔に書きたい場合。

活用例の振り返り

  • ファイルリストの作成osモジュールやglobモジュールを活用して、フォルダ内のすべてのファイルをリスト化。
  • 特定条件でのフィルタリング:拡張子や名前、正規表現を用いて必要なファイルのみを選択。
  • ファイルの一括処理:取得したファイルリストを用いて、内容の読み込みや書き込みを効率化。
  • 応用的な操作:リネーム、バックアップ作成、不要ファイルの削除など。

トラブルシューティングの重要性

ファイル操作を行う際に発生しやすいエラーについても触れました。以下を意識することで、スクリプトの信頼性を向上させられます。

  • ファイルやフォルダの存在確認を事前に行う。
  • アクセス権限や特殊文字への対応を考慮する。
  • 大量のファイルを扱う際のメモリ不足やパフォーマンスに注意する。

Pythonでのファイル名取得をマスターする利点

Pythonを使ったフォルダ内のファイル名取得は、多くのシーンで活用可能です。特に以下のような利点があります。

  1. 業務効率化:定型作業やデータ整理の自動化。
  2. 柔軟性:多様な条件でファイルを操作可能。
  3. スケーラビリティ:小規模から大規模なデータセットまで対応可能。

最後に

Pythonには、多彩なモジュールと機能が用意されています。今回紹介したos, glob, pathlibの各モジュールを適切に使い分けることで、ファイル操作における効率と精度を最大化できます。

この記事を通じて、初心者から中級者まで、Pythonでのファイル操作スキルを高める一助となれば幸いです。ぜひ、実際のプロジェクトや業務で応用し、Pythonの便利さを体感してください!