[Python] 指定したディレクトリにあるファイルを全て読み込む方法

Pythonで指定したディレクトリ内の全てのファイルを読み込むには、標準ライブラリのosglobモジュールを使用します。

os.listdir()を使うとディレクトリ内のファイル名を取得でき、os.path.join()でフルパスを作成してファイルを読み込むことができます。

また、glob.glob()を使うとワイルドカードを用いて特定のパターンに一致するファイルを取得できます。

pathlibモジュールも便利で、Path.glob()を使うと簡潔にファイルを操作できます。

この記事でわかること
  • osモジュールを使ったファイル操作
  • globモジュールでのファイル取得方法
  • pathlibモジュールの活用法
  • ファイルの条件付きフィルタリング
  • マルチスレッド・マルチプロセスの利用方法

目次から探す

osモジュールを使ってディレクトリ内のファイルを全て読み込む

Pythonのosモジュールを使用すると、指定したディレクトリ内のファイルを簡単に読み込むことができます。

以下では、osモジュールを使ったファイルの読み込み方法を詳しく解説します。

os.listdir()でファイル一覧を取得する

os.listdir()関数を使うと、指定したディレクトリ内のファイルとサブディレクトリの一覧を取得できます。

以下はそのサンプルコードです。

import os
# 読み込むディレクトリのパス
directory_path = '指定したディレクトリのパス'
# ディレクトリ内のファイルとサブディレクトリの一覧を取得
file_list = os.listdir(directory_path)
# 結果を表示
print(file_list)
['file1.txt', 'file2.txt', 'subdirectory']

os.path.join()でフルパスを作成する

os.path.join()を使用すると、ディレクトリパスとファイル名を結合してフルパスを作成できます。

これにより、OSに依存しないパスの作成が可能です。

import os
# 読み込むディレクトリのパス
directory_path = '指定したディレクトリのパス'
file_name = 'file1.txt'
# フルパスを作成
full_path = os.path.join(directory_path, file_name)
# 結果を表示
print(full_path)
指定したディレクトリのパス/file1.txt

ファイルを開いて内容を読み込む方法

取得したファイルのフルパスを使って、ファイルを開き、その内容を読み込むことができます。

以下はそのサンプルコードです。

import os
# 読み込むディレクトリのパス
directory_path = '指定したディレクトリのパス'
# ディレクトリ内のファイル一覧を取得
file_list = os.listdir(directory_path)
# 各ファイルの内容を読み込む
for file_name in file_list:
    full_path = os.path.join(directory_path, file_name)
    if os.path.isfile(full_path):  # ファイルかどうかを確認
        with open(full_path, 'r', encoding='utf-8') as file:
            content = file.read()
            print(f'内容 of {file_name}:')
            print(content)
内容 of file1.txt:
(file1.txtの内容)
内容 of file2.txt:
(file2.txtの内容)

サブディレクトリ内のファイルも再帰的に読み込む方法

os.walk()を使用すると、指定したディレクトリ内の全てのファイルとサブディレクトリを再帰的に取得できます。

以下はそのサンプルコードです。

import os
# 読み込むディレクトリのパス
directory_path = '指定したディレクトリのパス'
# ディレクトリ内の全てのファイルを再帰的に読み込む
for root, dirs, files in os.walk(directory_path):
    for file_name in files:
        full_path = os.path.join(root, file_name)
        with open(full_path, 'r', encoding='utf-8') as file:
            content = file.read()
            print(f'内容 of {full_path}:')
            print(content)
内容 of 指定したディレクトリのパス/file1.txt:
(file1.txtの内容)
内容 of 指定したディレクトリのパス/subdirectory/file2.txt:
(file2.txtの内容)

このように、osモジュールを使うことで、指定したディレクトリ内のファイルを簡単に読み込むことができます。

globモジュールを使ってディレクトリ内のファイルを全て読み込む

Pythonのglobモジュールを使用すると、指定したパターンにマッチするファイルを簡単に取得できます。

特にワイルドカードを使ったファイルのフィルタリングが得意です。

以下では、globモジュールを使ったファイルの読み込み方法を詳しく解説します。

glob.glob()でファイル一覧を取得する

glob.glob()関数を使うと、指定したパターンにマッチするファイルの一覧を取得できます。

以下はそのサンプルコードです。

import glob
# 読み込むディレクトリのパス
directory_path = '指定したディレクトリのパス/*'
# ディレクトリ内のファイル一覧を取得
file_list = glob.glob(directory_path)
# 結果を表示
print(file_list)
['指定したディレクトリのパス/file1.txt', '指定したディレクトリのパス/file2.txt']

ワイルドカードを使ったファイルのフィルタリング

globモジュールでは、ワイルドカードを使って特定の条件に合ったファイルをフィルタリングできます。

例えば、特定の拡張子を持つファイルだけを取得することができます。

import glob
# 特定の拡張子を持つファイルを取得
file_list = glob.glob('指定したディレクトリのパス/*.txt')
# 結果を表示
print(file_list)
['指定したディレクトリのパス/file1.txt', '指定したディレクトリのパス/file2.txt']

ファイルを開いて内容を読み込む方法

取得したファイルのフルパスを使って、ファイルを開き、その内容を読み込むことができます。

以下はそのサンプルコードです。

import glob
# 特定の拡張子を持つファイルを取得
file_list = glob.glob('指定したディレクトリのパス/*.txt')
# 各ファイルの内容を読み込む
for full_path in file_list:
    with open(full_path, 'r', encoding='utf-8') as file:
        content = file.read()
        print(f'内容 of {full_path}:')
        print(content)
内容 of 指定したディレクトリのパス/file1.txt:
(file1.txtの内容)
内容 of 指定したディレクトリのパス/file2.txt:
(file2.txtの内容)

再帰的にファイルを取得する方法

globモジュールでは、再帰的にファイルを取得するために**を使うことができます。

これにより、サブディレクトリ内のファイルも含めて取得できます。

import glob
# 再帰的に全てのテキストファイルを取得
file_list = glob.glob('指定したディレクトリのパス/**/*.txt', recursive=True)
# 各ファイルの内容を読み込む
for full_path in file_list:
    with open(full_path, 'r', encoding='utf-8') as file:
        content = file.read()
        print(f'内容 of {full_path}:')
        print(content)
内容 of 指定したディレクトリのパス/file1.txt:
(file1.txtの内容)
内容 of 指定したディレクトリのパス/subdirectory/file2.txt:
(file2.txtの内容)

このように、globモジュールを使うことで、指定したパターンにマッチするファイルを簡単に取得し、内容を読み込むことができます。

pathlibモジュールを使ってディレクトリ内のファイルを全て読み込む

Pythonのpathlibモジュールは、ファイルシステムのパスをオブジェクト指向で扱うための便利なツールです。

pathlibを使用すると、ディレクトリ内のファイルを簡単に読み込むことができます。

以下では、pathlibモジュールを使ったファイルの読み込み方法を詳しく解説します。

Path.glob()でファイル一覧を取得する

Path.glob()メソッドを使用すると、指定したパターンにマッチするファイルの一覧を取得できます。

以下はそのサンプルコードです。

from pathlib import Path
# 読み込むディレクトリのパス
directory_path = Path('指定したディレクトリのパス')
# ディレクトリ内のファイル一覧を取得
file_list = list(directory_path.glob('*'))
# 結果を表示
print(file_list)
[PosixPath('指定したディレクトリのパス/file1.txt'), PosixPath('指定したディレクトリのパス/file2.txt')]

Path.iterdir()でディレクトリ内のファイルを取得する

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

以下はそのサンプルコードです。

from pathlib import Path
# 読み込むディレクトリのパス
directory_path = Path('指定したディレクトリのパス')
# ディレクトリ内のファイルとサブディレクトリを取得
for item in directory_path.iterdir():
    print(item)
指定したディレクトリのパス/file1.txt
指定したディレクトリのパス/file2.txt
指定したディレクトリのパス/subdirectory

ファイルを開いて内容を読み込む方法

取得したファイルのパスを使って、ファイルを開き、その内容を読み込むことができます。

以下はそのサンプルコードです。

from pathlib import Path
# 読み込むディレクトリのパス
directory_path = Path('指定したディレクトリのパス')
# ディレクトリ内のファイル一覧を取得
file_list = list(directory_path.glob('*.txt'))
# 各ファイルの内容を読み込む
for file_path in file_list:
    with file_path.open('r', encoding='utf-8') as file:
        content = file.read()
        print(f'内容 of {file_path}:')
        print(content)
内容 of 指定したディレクトリのパス/file1.txt:
(file1.txtの内容)
内容 of 指定したディレクトリのパス/file2.txt:
(file2.txtの内容)

再帰的にファイルを取得する方法

Path.rglob()メソッドを使用すると、再帰的にファイルを取得することができます。

これにより、サブディレクトリ内のファイルも含めて取得できます。

from pathlib import Path
# 再帰的に全てのテキストファイルを取得
directory_path = Path('指定したディレクトリのパス')
# 再帰的に全てのテキストファイルを取得
file_list = list(directory_path.rglob('*.txt'))
# 各ファイルの内容を読み込む
for file_path in file_list:
    with file_path.open('r', encoding='utf-8') as file:
        content = file.read()
        print(f'内容 of {file_path}:')
        print(content)
内容 of 指定したディレクトリのパス/file1.txt:
(file1.txtの内容)
内容 of 指定したディレクトリのパス/subdirectory/file2.txt:
(file2.txtの内容)

このように、pathlibモジュールを使うことで、指定したディレクトリ内のファイルを簡単に取得し、内容を読み込むことができます。

応用例:特定の条件でファイルをフィルタリングする

ファイルを読み込む際に、特定の条件に基づいてフィルタリングすることができます。

ここでは、拡張子、ファイル名、ファイルサイズや作成日時に基づいてファイルをフィルタリングする方法を解説します。

拡張子でファイルをフィルタリングする方法

特定の拡張子を持つファイルだけを取得するには、globモジュールやpathlibモジュールを使用することができます。

以下は、pathlibを使ったサンプルコードです。

from pathlib import Path
# 読み込むディレクトリのパス
directory_path = Path('指定したディレクトリのパス')
# 特定の拡張子を持つファイルを取得
txt_files = list(directory_path.glob('*.txt'))
# 結果を表示
print(txt_files)
[PosixPath('指定したディレクトリのパス/file1.txt'), PosixPath('指定したディレクトリのパス/file2.txt')]

ファイル名に特定の文字列が含まれるファイルを取得する方法

ファイル名に特定の文字列が含まれるファイルを取得するには、iterdir()メソッドを使ってファイル名をチェックすることができます。

以下はそのサンプルコードです。

from pathlib import Path
# 読み込むディレクトリのパス
directory_path = Path('指定したディレクトリのパス')
# 特定の文字列が含まれるファイルを取得
keyword = '特定の文字列'
filtered_files = [file for file in directory_path.iterdir() if keyword in file.name]
# 結果を表示
print(filtered_files)
[PosixPath('指定したディレクトリのパス/特定の文字列_file1.txt'), PosixPath('指定したディレクトリのパス/特定の文字列_file2.txt')]

ファイルサイズや作成日時でフィルタリングする方法

ファイルサイズや作成日時に基づいてフィルタリングするには、stat()メソッドを使用してファイルのメタデータを取得します。

以下はそのサンプルコードです。

from pathlib import Path
import time
# 読み込むディレクトリのパス
directory_path = Path('指定したディレクトリのパス')
# フィルタリング条件
size_limit = 1024  # 1KB以上のファイル
time_limit = time.time() - (7 * 24 * 60 * 60)  # 1週間以内に作成されたファイル
# ファイルサイズと作成日時でフィルタリング
filtered_files = [
    file for file in directory_path.iterdir()
    if file.is_file() and file.stat().st_size > size_limit and file.stat().st_ctime > time_limit
]
# 結果を表示
print(filtered_files)
[PosixPath('指定したディレクトリのパス/file1.txt'), PosixPath('指定したディレクトリのパス/file2.txt')]

このように、特定の条件に基づいてファイルをフィルタリングすることで、必要なファイルを効率的に取得することができます。

応用例:ファイルの内容を一括で処理する

ファイルの内容を一括で処理することは、データの管理や分析において非常に便利です。

ここでは、ファイルの内容を一括で読み込んで処理する方法、書き換える方法、コピーする方法について解説します。

ファイルの内容を一括で読み込んで処理する方法

複数のファイルの内容を一括で読み込んで処理するには、pathlibモジュールを使用してファイルを取得し、内容を読み込むことができます。

以下はそのサンプルコードです。

from pathlib import Path
# 読み込むディレクトリのパス
directory_path = Path('指定したディレクトリのパス')
# 全てのテキストファイルを取得
txt_files = list(directory_path.glob('*.txt'))
# 各ファイルの内容を一括で読み込んで処理
for file_path in txt_files:
    with file_path.open('r', encoding='utf-8') as file:
        content = file.read()
        # ここで内容を処理する(例:行数をカウント)
        line_count = len(content.splitlines())
        print(f'{file_path.name} の行数: {line_count}')
file1.txt の行数: 10
file2.txt の行数: 15

ファイルの内容を一括で書き換える方法

複数のファイルの内容を一括で書き換えるには、ファイルを開いて新しい内容を書き込むことができます。

以下はそのサンプルコードです。

from pathlib import Path
# 読み込むディレクトリのパス
directory_path = Path('指定したディレクトリのパス')
# 全てのテキストファイルを取得
txt_files = list(directory_path.glob('*.txt'))
# 各ファイルの内容を一括で書き換える
for file_path in txt_files:
    with file_path.open('r', encoding='utf-8') as file:
        content = file.read()
    
    # 新しい内容を作成(例:内容の先頭に追加)
    new_content = '新しい内容の先頭\n' + content
    
    with file_path.open('w', encoding='utf-8') as file:
        file.write(new_content)
        print(f'{file_path.name} の内容を書き換えました。')
file1.txt の内容を書き換えました。
file2.txt の内容を書き換えました。

ファイルの内容を一括でコピーする方法

複数のファイルの内容を一括でコピーするには、shutilモジュールを使用することができます。

以下はそのサンプルコードです。

from pathlib import Path
import shutil
# 読み込むディレクトリのパス
source_directory = Path('指定したディレクトリのパス')
destination_directory = Path('コピー先のディレクトリのパス')
# コピー先のディレクトリが存在しない場合は作成
destination_directory.mkdir(parents=True, exist_ok=True)
# 全てのテキストファイルを取得
txt_files = list(source_directory.glob('*.txt'))
# 各ファイルの内容を一括でコピー
for file_path in txt_files:
    shutil.copy(file_path, destination_directory / file_path.name)
    print(f'{file_path.name} を {destination_directory} にコピーしました。')
file1.txt を コピー先のディレクトリのパス にコピーしました。
file2.txt を コピー先のディレクトリのパス にコピーしました。

このように、ファイルの内容を一括で読み込んだり、書き換えたり、コピーしたりすることで、効率的にデータを管理することができます。

応用例:大規模なディレクトリのファイルを効率的に処理する

大規模なディレクトリ内のファイルを効率的に処理するためには、マルチスレッドやマルチプロセスを活用することが有効です。

また、処理の進捗を表示することで、ユーザーに進行状況を知らせることも重要です。

以下では、これらの方法について解説します。

マルチスレッドを使ったファイル処理の並列化

concurrent.futuresモジュールのThreadPoolExecutorを使用すると、マルチスレッドでファイル処理を並列化できます。

以下はそのサンプルコードです。

from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
# 読み込むディレクトリのパス
directory_path = Path('指定したディレクトリのパス')
# ファイルを処理する関数
def process_file(file_path):
    with file_path.open('r', encoding='utf-8') as file:
        content = file.read()
        # ここで内容を処理する(例:行数をカウント)
        line_count = len(content.splitlines())
        print(f'{file_path.name} の行数: {line_count}')
# 全てのテキストファイルを取得
txt_files = list(directory_path.glob('*.txt'))
# マルチスレッドでファイル処理を実行
with ThreadPoolExecutor() as executor:
    executor.map(process_file, txt_files)
file1.txt の行数: 10
file2.txt の行数: 15

マルチプロセスを使ったファイル処理の並列化

concurrent.futuresモジュールのProcessPoolExecutorを使用すると、マルチプロセスでファイル処理を並列化できます。

以下はそのサンプルコードです。

from concurrent.futures import ProcessPoolExecutor
from pathlib import Path
# 読み込むディレクトリのパス
directory_path = Path('指定したディレクトリのパス')
# ファイルを処理する関数
def process_file(file_path):
    with file_path.open('r', encoding='utf-8') as file:
        content = file.read()
        # ここで内容を処理する(例:行数をカウント)
        line_count = len(content.splitlines())
        return f'{file_path.name} の行数: {line_count}'
# 全てのテキストファイルを取得
txt_files = list(directory_path.glob('*.txt'))
# マルチプロセスでファイル処理を実行
with ProcessPoolExecutor() as executor:
    results = executor.map(process_file, txt_files)
# 結果を表示
for result in results:
    print(result)
file1.txt の行数: 10
file2.txt の行数: 15

ファイル処理の進捗を表示する方法

ファイル処理の進捗を表示するには、tqdmライブラリを使用することができます。

これにより、処理の進行状況を視覚的に表示できます。

以下はそのサンプルコードです。

from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
from tqdm import tqdm
# 読み込むディレクトリのパス
directory_path = Path('指定したディレクトリのパス')
# ファイルを処理する関数
def process_file(file_path):
    with file_path.open('r', encoding='utf-8') as file:
        content = file.read()
        # ここで内容を処理する(例:行数をカウント)
        line_count = len(content.splitlines())
        return f'{file_path.name} の行数: {line_count}'
# 全てのテキストファイルを取得
txt_files = list(directory_path.glob('*.txt'))
# マルチスレッドでファイル処理を実行し、進捗を表示
with ThreadPoolExecutor() as executor:
    results = list(tqdm(executor.map(process_file, txt_files), total=len(txt_files)))
# 結果を表示
for result in results:
    print(result)
file1.txt の行数: 10
file2.txt の行数: 15

このように、マルチスレッドやマルチプロセスを活用することで、大規模なディレクトリ内のファイルを効率的に処理することができます。

また、進捗を表示することで、処理の状況を把握しやすくなります。

よくある質問

osモジュールとpathlibモジュールの違いは?

osモジュールとpathlibモジュールは、どちらもファイルシステムにアクセスするためのツールですが、いくつかの違いがあります。

  • オブジェクト指向 vs. 手続き型: pathlibはオブジェクト指向のアプローチを採用しており、パスをオブジェクトとして扱います。

一方、osモジュールは手続き型で、関数を使用してパスを操作します。

  • 可読性: pathlibは、パスの操作が直感的で可読性が高いです。

例えば、Path('dir') / 'file.txt'のように、スラッシュ演算子を使ってパスを結合できます。

  • 機能の豊富さ: pathlibは、ファイルのメタデータを取得するためのメソッドが豊富で、ファイルの存在確認や拡張子の取得などが簡単に行えます。

再帰的にファイルを取得するにはどうすればいい?

再帰的にファイルを取得する方法はいくつかありますが、osモジュールではos.walk()pathlibモジュールではrglob()メソッドを使用するのが一般的です。

  • osモジュール:
  import os
  for root, dirs, files in os.walk('指定したディレクトリのパス'):
      for file in files:
          print(os.path.join(root, file))
  • pathlibモジュール:
  from pathlib import Path
  for file in Path('指定したディレクトリのパス').rglob('*.txt'):
      print(file)

これにより、指定したディレクトリ内の全てのファイルを再帰的に取得することができます。

特定の拡張子のファイルだけを取得するには?

特定の拡張子のファイルを取得する方法も、osモジュールとpathlibモジュールで異なります。

  • osモジュール:
  import os
  directory_path = '指定したディレクトリのパス'
  for file in os.listdir(directory_path):
      if file.endswith('.txt'):
          print(file)
  • pathlibモジュール:
  from pathlib import Path
  directory_path = Path('指定したディレクトリのパス')
  for file in directory_path.glob('*.txt'):
      print(file)

これにより、指定した拡張子(この場合は.txt)を持つファイルだけを取得することができます。

まとめ

この記事では、Pythonを使用して指定したディレクトリ内のファイルを効率的に読み込む方法や、特定の条件でファイルをフィルタリングする技術について詳しく解説しました。

また、ファイルの内容を一括で処理する方法や、大規模なディレクトリのファイルを効率的に処理するためのマルチスレッドやマルチプロセスの活用法についても触れました。

これらの知識を活用して、実際のプロジェクトや業務においてファイル操作をより効率的に行うことをお勧めします。

  • URLをコピーしました!
目次から探す