[Python] 指定したディレクトリにあるファイルを全て読み込む方法
Pythonで指定したディレクトリ内の全てのファイルを読み込むには、標準ライブラリのos
やglob
モジュールを使用します。
os.listdir()
を使うとディレクトリ内のファイル名を取得でき、os.path.join()
でフルパスを作成してファイルを読み込むことができます。
また、glob.glob()
を使うとワイルドカードを用いて特定のパターンに一致するファイルを取得できます。
pathlib
モジュールも便利で、Path.glob()
を使うと簡潔にファイルを操作できます。
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
このように、マルチスレッドやマルチプロセスを活用することで、大規模なディレクトリ内のファイルを効率的に処理することができます。
また、進捗を表示することで、処理の状況を把握しやすくなります。
まとめ
この記事では、Pythonを使用して指定したディレクトリ内のファイルを効率的に読み込む方法や、特定の条件でファイルをフィルタリングする技術について詳しく解説しました。
また、ファイルの内容を一括で処理する方法や、大規模なディレクトリのファイルを効率的に処理するためのマルチスレッドやマルチプロセスの活用法についても触れました。
これらの知識を活用して、実際のプロジェクトや業務においてファイル操作をより効率的に行うことをお勧めします。