Python
Pythonでディレクトリ内のすべてのファイルを簡単に取得する方法:初心者向けガイド

Pythonでディレクトリ内のすべてのファイルを簡単に取得する方法:初心者向けガイド

MoeNagy Dev

ファイルパスの理解

絶対パスと相対パス

Pythonでは、絶対パスと相対パスの両方を使ってファイルパスを扱うことができます。絶対パスは、ファイルシステムのルートから始まるファイルまたはディレクトリの完全で曖昧でない場所です。一方、相対パスは、現在の作業ディレクトリまたはファイルシステム内の特定の場所に対して相対的なパスです。

以下は、Pythonで絶対パスと相対パスを使用する例です:

# 絶対パス
absolute_path = "/Users/username/documents/file.txt"
 
# 相対パス
relative_path = "documents/file.txt"

os.path.abspath()関数を使用して相対パスを絶対パスに変換することができます:

import os
 
relative_path = "documents/file.txt"
absolute_path = os.path.abspath(relative_path)
print(absolute_path)
# 出力:/Users/username/documents/file.txt

Pythonでファイルシステムを操作する

Pythonのosおよびos.pathモジュールは、ファイルシステムを操作するための一連の関数を提供しています。以下はよく使用される関数のいくつかです:

  • os.getcwd(): 現在の作業ディレクトリを返します。
  • os.chdir(path): 現在の作業ディレクトリを指定されたパスに変更します。
  • os.path.join(path1, path2, ...): 1つ以上のパスコンポーネントを賢く結合します。
  • os.path.dirname(path): 指定されたパスのディレクトリ名を返します。
  • os.path.basename(path): 指定されたパスのベース名を返します。

例:

import os
 
# 現在の作業ディレクトリを取得する
current_dir = os.getcwd()
print(current_dir)
 
# 現在の作業ディレクトリを変更する
os.chdir("/Users/username/documents")
new_dir = os.getcwd()
print(new_dir)
 
# パスを結合する
file_path = os.path.join(new_dir, "file.txt")
print(file_path)
 
# ディレクトリ名とベース名を取得する
dir_name = os.path.dirname(file_path)
base_name = os.path.basename(file_path)
print(dir_name)
print(base_name)

ディレクトリ内のファイルのリストを取得する

os.listdir()関数を使用する

特定のディレクトリ内のファイルとディレクトリのリストを取得するには、os.listdir()関数を使用することができます。この関数は、指定されたディレクトリのすべてのアイテム(ファイルとディレクトリ)のリストを返します。

例:

import os
 
# 現在のディレクトリのファイルとディレクトリのリストを取得する
items = os.listdir(".")
print(items)

ファイルのリストをフィルタリングする

os.path.isfile()関数とos.path.isdir()関数を使用して、ファイルとディレクトリのリストをフィルタリングすることができます。

例:

import os
 
# 現在のディレクトリのファイルとディレクトリのリストを取得する
items = os.listdir(".")
 
# ファイルのみを取得する
files = [item for item in items if os.path.isfile(item)]
print(files)
 
# ディレクトリのみを取得する
directories = [item for item in items if os.path.isdir(item)]
print(directories)

サブディレクトリの処理

サブディレクトリを再帰的に処理する

サブディレクトリをトラバースし、ディレクトリツリー内のすべてのファイルのリストを取得するには、再帰的なアプローチを使用することができます。これには、ファンクションまたはロジック内で同じファンクションまたはロジックを呼び出してサブディレクトリを処理する必要があります。

例:

import os
 
def get_all_files(directory):
    all_files = []
    for item in os.listdir(directory):
        item_path = os.path.join(directory, item)
        if os.path.isfile(item_path):
            all_files.append(item_path)
        elif os.path.isdir(item_path):
            all_files.extend(get_all_files(item_path))
    return all_files
 
# 現在のディレクトリとサブディレクトリ内のすべてのファイルを取得する
all_files = get_all_files(".")
print(all_files)

ディレクトリかファイルかの識別

os.path.isfile()関数とos.path.isdir()関数を使用して、ファイルシステム内のアイテムがファイルかディレクトリかを判断することができます。

例:

import os
 
# パスがファイルかどうかをチェックする
if os.path.isfile("file.txt"):
    print("ファイルです!")
else:
    print("ファイルではありません。")
 
# パスがディレクトリかどうかをチェックする
if os.path.isdir("documents"):
    print("ディレクトリです!")
else:
    print("ディレクトリではありません。")

os.walk()関数の使用

os.walk()関数の探索

os.walk()関数は、ディレクトリツリーを再帰的にトラバースし、すべてのファイルとディレクトリのリストを取得するためのより便利な方法を提供します。この関数は、第1引数で指定されたディレクトリをルートとするツリー内の各ディレクトリに対して3つ組を生成します:

  1. ルートディレクトリ
  2. root内のサブディレクトリの名前のリスト('.''..'は除く)
  3. root内のサブディレクトリでないファイルの名前のリスト

例:

import os
 
for root, dirs, files in os.walk("."):
    print(f"ルートディレクトリ:{root}")
    print(f"サブディレクトリ:{dirs}")
    print(f"ファイル:{files}")
    print()

os.walk()の動作のカスタマイズ

os.walk()の動作をカスタマイズするには、追加の引数を指定することができます:

  • topdownTrueの場合、os.walk()はディレクトリをディレクトリツリーの順序どおりに訪問します(デフォルトはTrueです)。
  • onerroros.walk()がエラーに遭遇したときに呼び出される関数です。この関数は、1つの引数であるOSErrorインスタンスを受け入れる必要があります。
  • followlinksTrueの場合、os.walk()はシンボリックリンクをたどります(デフォルトはFalseです)。

例:

import os
 
for root, dirs, files in os.walk(".", topdown=False, onerror=lambda err: print(f"エラー:{err}"), followlinks=True):
    print(f"ルートディレクトリ:{root}")
    print(f"サブディレクトリ:{dirs}")
    print(f"ファイル:{files}")
    print()

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

ファイルの拡張子の確認

os.path.splitext() 関数を使用すると、ファイルのパスのルートと拡張子を含む2つの要素からなるタプルが返されます。

例:

import os
 
file_path = "documents/file.txt"
root, ext = os.path.splitext(file_path)
print(f"Root: {root}")
print(f"Extension: {ext}")

特定の拡張子を持つファイルのリストの作成

ファイルの拡張子のチェックをディレクトリトラバーサルのテクニックと組み合わせることで、特定の拡張子を持つファイルのリストを作成することができます。

例:

import os
 
def get_files_by_extension(directory, extension):
    all_files = []
    for root, dirs, files in os.walk(directory):
        for file in files:
            if file.endswith(extension):
                file_path = os.path.join(root, file)
                all_files.append(file_path)
    return all_files
 
# 現在のディレクトリとサブディレクトリ内のすべての .txt ファイルを取得します
txt_files = get_files_by_extension(".", ".txt")
print(txt_files)

ファイルリストのソートと整理

ファイルリストのソート

ファイル名、サイズ、または変更日時などの基準に基づいてファイルリストをソートすることができます。Pythonの sorted() 関数を使用すると、ファイルのリストをソートすることができます。

例:

import os
 
# 現在のディレクトリのファイルリストを取得する
files = os.listdir(".")
 
# ファイル名でソートする
sorted_files = sorted(files)
print(sorted_files)
 
# サイズでソートする
file_sizes = [(file, os.path.getsize(file)) for file in files]
sorted_by_size = sorted(file_sizes, key=lambda x: x[1])
print(sorted_by_size)

拡張子ごとにファイルをグループ化する

ファイルを拡張子ごとにグループ化し、ファイルを整理するために辞書や類似のデータ構造を作成することができます。

例:

import os
from collections import defaultdict
 
def group_files_by_extension(directory):
    file_groups = defaultdict(list)
    for root, dirs, files in os.walk(directory):
        for file in files:
            _, ext = os.path.splitext(file)
            file_path = os.path.join(root, file)
            file_groups[ext].append(file_path)
    return file_groups
 
# 現在のディレクトリとサブディレクトリ内のファイルをグループ化します
file_groups = group_files_by_extension(".")
for extension, files in file_groups.items():
    print(f"{extension}: {files}")

エラーと例外処理

権限とアクセスの問題の処理

ファイルシステムで作業する際には、権限やアクセスの問題が発生することがあります。これらのエラーを処理し、適切なエラーハンドリングを提供するために try-except ブロックを使用することができます。

例:

import os
 
def get_file_info(file_path):
    try:
        file_size = os.path.getsize(file_path)
        last_modified = os.path.getmtime(file_path)
        return file_size, last_modified
    except OSError as e:
        print(f"ファイル {file_path} にアクセス中にエラーが発生しました: {e}")
        return None, None
 
# ファイルの情報を取得する
file_info = get_file_info("file.txt")
if file_info[0] is not None:
    file_size, last_modified = file_info
    print(f"ファイルサイズ: {file_size} バイト")
    print(f"最終更新日時: {last_modified}")

シンボリックリンクやその他の特殊ファイルの処理

Pythonの os および os.path モジュールは、シンボリックリンク、名前付きパイプ、デバイスファイルなどのさまざまな種類の特殊ファイルを処理することができます。ファイルがシンボリックリンクであるかどうかを確認するには、 os.path.islink() 関数を使用することができます。

例:

import os
 
def handle_special_files(directory):
    for root, dirs, files in os.walk(directory):
        for file in files:
            file_path = os.path.join(root, file)
            if os.path.islink(file_path):
                print(f"シンボリックリンク: {file_path}")
            elif os.path.isfifo(file_path):
                print(f"名前付きパイプ: {file_path}")
            elif os.path.isdev(file_path):
                print(f"デバイスファイル: {file_path}")
            else:
                print(f"通常のファイル: {file_path}")
 
# 現在のディレクトリとサブディレクトリ内の特殊ファイルを処理する
handle_special_files(".")

データ構造

リスト

リストはPythonで最も基本的なデータ構造の1つです。異なるデータ型(数値、文字列、または他のリストや辞書などのデータ構造)の値を保持できる順序付けられたコレクションです。

以下にリストを作成し、一部の一般的な操作を行う例を示します:

# リストの作成
fruits = ['apple', 'banana', 'cherry']
 
# 要素のアクセス
print(fruits[0])  # 出力: 'apple'
print(fruits[-1])  # 出力: 'cherry'
 
# 要素の追加
fruits.append('orange')
print(fruits)  # 出力: ['apple', 'banana', 'cherry', 'orange']
 
# 要素の削除
fruits.remove('banana')
print(fruits)  # 出力: ['apple', 'cherry', 'orange']
 
# スライス
print(fruits[1:3])  # 出力: ['cherry', 'orange']

タプル

タプルはリストと似ていますが、作成後に内容を変更することはできない(不変)という点が異なります。タプルは角括弧 () を使用して定義されます。

# タプルの作成
point = (2, 3)
print(point)  # 出力: (2, 3)
 
# 要素のアクセス
print(point[0])  # 出力: 2
print(point[1])  # 出力: 3
 
# タプルの展開
x, y = point
print(x)  # 出力: 2
print(y)  # 出力: 3

辞書

辞書はキーと値のペアの順不同のコレクションです。一意のキーを使用してデータを迅速に保存および取得することができます。

# 辞書の作成
person = {
    'name': 'John Doe',
    'age': 30,
    'city': 'New York'
}
 
# 値の取得
print(person['name'])  # 出力: 'John Doe'
print(person['age'])  # 出力: 30
 
# エントリの追加と変更
person['email'] = 'john.doe@example.com'
person['age'] = 31
print(person)  # 出力: {'name': 'John Doe', 'age': 31, 'city': 'New York', 'email': 'john.doe@example.com'}
 
# 辞書の反復処理
for key, value in person.items():
    print(f"{key}: {value}")

集合


title: セット

セットは、重複のない要素の無順なコレクションです。セットは、結合、交差、差などの操作を実行するために便利です。

# セットの作成
colors = {'red', 'green', 'blue'}
print(colors)  # 出力: {'red', 'green', 'blue'}
 
# 要素の追加と削除
colors.add('yellow')
colors.remove('green')
print(colors)  # 出力: {'red', 'blue', 'yellow'}
 
# セットの操作
set1 = {1, 2, 3}
set2 = {2, 3, 4}
print(set1 | set2)  # 和集合: {1, 2, 3, 4}
print(set1 & set2)  # 積集合: {2, 3}
print(set1 - set2)  # 差集合: {1}

制御フロー

条件付き文

条件付き文(if-elseif-elif-else)は、特定の条件に基づいて異なるブロックのコードを実行することができます。

# if-else 文
age = 18
if age >= 18:
    print("成人です。")
else:
    print("未成年です。")
 
# if-elif-else 文
score = 85
if score >= 90:
    print("A")
elif score >= 80:
    print("B")
elif score >= 70:
    print("C")
else:
    print("D")

ループ

forwhile のようなループを使用すると、コードブロックを繰り返し実行することができます。

# for ループ
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)
 
# while ループ
count = 0
while count < 5:
    print(count)
    count += 1

リスト内包表記

リスト内包表記を使用すると、既存のリストを基に新しいリストを簡潔に作成することができます。

# リスト内包表記
numbers = [1, 2, 3, 4, 5]
squares = [x**2 for x in numbers]
print(squares)  # 出力: [1, 4, 9, 16, 25]
 
# 条件付きリスト内包表記
even_numbers = [x for x in numbers if x % 2 == 0]
print(even_numbers)  # 出力: [2, 4]

関数

関数は、特定のタスクを実行する再利用可能なコードブロックです。引数を受け取り、値を返すことができ、コードを整理するのに役立ちます。

# 関数の定義
def greet(name):
    print(f"こんにちは、{name}さん!")
 
# 関数の呼び出し
greet("Alice")  # 出力: こんにちは、Aliceさん!
 
# 戻り値のある関数
def add_numbers(a, b):
    return a + b
 
result = add_numbers(3, 4)
print(result)  # 出力: 7

モジュールとパッケージ

Pythonの広範な標準ライブラリやサードパーティのパッケージは、プロジェクトで活用できる多くの機能を提供しています。

# モジュールのインポート
import math
print(math.pi)  # 出力: 3.141592653589793
 
# モジュールから特定の関数のみをインポート
from math import sqrt, floor
print(sqrt(16))  # 出力: 4.0
print(floor(3.7))  # 出力: 3
 
# パッケージのインポート
import datetime
print(datetime.datetime.now())  # 出力: 2023-04-24 12:34:56.789012

例外処理

例外処理を使用すると、コード内のエラーや予期しない状況をスムーズに処理することができます。

# 例外の処理
try:
    result = 10 / 0
except ZeroDivisionError:
    print("エラー: ゼロでの割り算はできません。")
 
# 複数の例外の処理
try:
    int('abc')
except ValueError:
    print("エラー: 無効な整数形式です。")

ファイルの入出力

Pythonでは、ファイルへの書き込みや読み込みのための組み込み関数やメソッドが提供されています。

# ファイルへの書き込み
with open('example.txt', 'w') as file:
    file.write("こんにちは、世界!")
 
# ファイルからの読み込み
with open('example.txt', 'r') as file:
    content = file.read()
    print(content)  # 出力: こんにちは、世界!

結論

このPythonチュートリアルでは、さまざまなデータ構造、制御フロー、関数、モジュールとパッケージ、例外処理、ファイルの入出力について学びました。これらの概念はPythonプログラミングの基礎を形成し、効率的で保守しやすいコードを書くのに役立ちます。定期的に練習し、Pythonの豊富なライブラリやフレームワークの広範なエコシステムを探索して知識とスキルを拡大することを忘れないでください。

MoeNagy Dev