Python
Pythonを使ってディレクトリからファイルを簡単に取得する方法

Pythonを使ってディレクトリからファイルを簡単に取得する方法

MoeNagy Dev

Pythonを使ってディレクトリからファイルを取得する方法

os.listdir()のパワー

os.listdir()関数の理解

os.listdir()関数は、指定されたディレクトリ内のすべてのファイルとディレクトリのリストを取得するためのPython標準ライブラリの強力なツールです。この関数は、オペレーティングシステムとの対話方法を提供するosモジュールの一部です。

os.listdir()を使用する基本的な例は次のとおりです:

import os
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
print(file_list)

このコードは、指定されたdirectory_path内のすべてのファイルとディレクトリのリストを出力します。

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

ディレクトリ内のファイルのみ(ディレクトリではない)のリストを取得するには、次の方法を使用できます:

import os
 
directory_path = '/path/to/directory'
file_list = [f for f in os.listdir(directory_path) if os.path.isfile(os.path.join(directory_path, f))]
print(file_list)

この例では、os.listdir()が返すリストをリスト内包表記を使用してフィルタリングし、os.path.isfile()関数を使用してディレクトリではなくファイルのみを含めます。

サブディレクトリと再帰的なファイルの取得

指定されたディレクトリだけでなく、そのサブディレクトリからもファイルを取得する場合は、再帰的なアプローチを使用できます。次に例を示します:

import os
 
def get_all_files(directory_path):
    file_list = []
    for root, dirs, files in os.walk(directory_path):
        for file in files:
            file_list.append(os.path.join(root, file))
    return file_list
 
directory_path = '/path/to/directory'
all_files = get_all_files(directory_path)
print(all_files)

この例では、os.walk()関数を使用してディレクトリツリーを再帰的に走査するget_all_files()関数を定義しています。出会った各ファイルに対して、os.path.join()を使用して完全なファイルパスを構築し、それをfile_listに追加します。

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

含めるファイルの拡張子の指定

特定のファイル拡張子のファイルのみを取得するには、次の方法を使用できます:

import os
 
directory_path = '/path/to/directory'
allowed_extensions = ['.txt', '.py', '.jpg']
 
file_list = [f for f in os.listdir(directory_path) if any(f.endswith(ext) for ext in allowed_extensions)]
print(file_list)

この例では、allowed_extensionsのリストを定義し、それを使用してos.listdir()が返すファイルのリストをフィルタリングして、指定した拡張子を持つファイルのみを含めます。

特定のファイル拡張子の除外

同様に、リスト内包表記を変更することで、特定のファイル拡張子を除外することもできます:

import os
 
directory_path = '/path/to/directory'
excluded_extensions = ['.pyc', '.log']
 
file_list = [f for f in os.listdir(directory_path) if not any(f.endswith(ext) for ext in excluded_extensions)]
print(file_list)

ここでは、excluded_extensionsのリストを定義し、リスト内包表記を使用してファイルのリストをフィルタリングし、指定した拡張子を持つファイルを除外します。

複数のファイル拡張子の扱い

セットまたはディクショナリを使用することで、より柔軟な方法で複数のファイル拡張子を扱うこともできます:

import os
 
directory_path = '/path/to/directory'
allowed_extensions = {'.txt', '.py', '.jpg'}
 
file_list = [f for f in os.listdir(directory_path) if any(f.endswith(ext) for ext in allowed_extensions)]
print(file_list)

この例では、リストの代わりにセットであるallowed_extensionsを使用しています。これにより、リスト内包表記を変更せずに拡張子を簡単に追加または削除できます。

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

ファイルリストのアルファベット順ソート

ファイルリストをアルファベット順にソートするには、組み込みのsorted()関数を使用できます:

import os
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
sorted_file_list = sorted(file_list)
print(sorted_file_list)

これにより、ファイルリストが昇順でアルファベット順にソートされます。

ファイルサイズまたは変更日時でソート

ファイルリストをファイルサイズまたは変更日時でソートするには、それぞれos.path.getsize()およびos.path.getmtime()関数を使用できます:

import os
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
 
# ファイルサイズでソート
sorted_by_size = sorted(file_list, key=lambda x: os.path.getsize(os.path.join(directory_path, x)))
print(sorted_by_size)
 
# 変更日時でソート
sorted_by_date = sorted(file_list, key=lambda x: os.path.getmtime(os.path.join(directory_path, x)))
print(sorted_by_date)

最初の例では、sorted()関数をカスタムキー関数とともに使用し、os.path.getsize()を使用してファイルサイズを取得します。2番目の例では、os.path.getmtime()で取得した変更日時をソートキーとして使用しています。

拡張子でファイルをグループ化

ファイルを拡張子ごとにグループ化するには、ファイルを拡張子でグループ化するためのディクショナリを使用できます:

import os
from collections import defaultdict
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
 
file_groups = defaultdict(list)
for filename in file_list:
    extension = os.path.splitext(filename)[1].lower()
    file_groups[extension].append(filename)
 
for extension, files in file_groups.items():
    print(f"拡張子 '{extension}' のファイル: {', '.join(files)}")

Pathlibを使用する

Pathlibモジュールの紹介

Pythonのpathlibモジュールは、ファイルパスを扱うためのオブジェクト指向的な方法を提供します。従来のos.pathモジュールと比べて、直感的でクロスプラットフォームのアプローチを提供します。

Pathlibを使用したファイルのリスト表示

以下は、pathlibを使用してディレクトリ内のファイルをリスト表示する方法の例です。

from pathlib import Path
 
directory_path = '/path/to/directory'
file_list = [p.name for p in Path(directory_path).glob('*')]
print(file_list)

この例では、pathlibモジュールのPathクラスを使用してディレクトリパスを表します。glob()メソッドを使用して、指定したディレクトリ内のすべてのファイルとディレクトリのリストを取得します。

Pathlibを使用したファイルのメタデータへのアクセス

pathlibを使用して、ファイルのサイズや変更日などのファイルのメタデータに簡単にアクセスすることもできます。

from pathlib import Path
 
file_path = '/path/to/file.txt'
file_path = Path(file_path)
 
print(f"ファイル名:{file_path.name}")
print(f"ファイルサイズ:{file_path.stat().st_size} バイト")
print(f"変更日時:{file_path.stat().st_mtime}")

このコードは、pathlib.Pathオブジェクトを使用してファイル名、ファイルサイズ、および変更日時を取得する方法を示しています。

隠しファイルとディレクトリの処理

隠しファイルとディレクトリの識別

多くのファイルシステムでは、ドットで始まるファイルやディレクトリ(例: .gitignore)は「隠し」ファイルと見なされ、通常、ディレクトリリストに表示されません。これらの隠しアイテムを含めるか除外するには、次の方法を使用できます。

import os
 
directory_path = '/path/to/directory'
all_items = os.listdir(directory_path)
visible_items = [item for item in all_items if not item.startswith('.')]
hidden_items = [item for item in all_items if item.startswith('.')]
 
print("表示されるアイテム:", visible_items)
print("隠されたアイテム:", hidden_items)

この例では、os.listdir()を使用してディレクトリ内のすべてのアイテムのリストを取得します。次に、アイテム名がドットで始まるかどうかに基づいて、表示されるアイテムと隠されたアイテムを分けるために2つのリスト内包表記を使用します。

含めるかどうかを選択する

使用目的によっては、隠しファイルとディレクトリを含めるか除外するか選択することがあります。以下はその処理の例です。

import os
 
directory_path = '/path/to/directory'
include_hidden = False
 
all_items = os.listdir(directory_path)
if include_hidden:
    file_list = all_items
else:
    file_list = [item for item in all_items if not item.startswith('.')]
 
print(file_list)

この例では、隠しアイテムを最終的なファイルリストに含めるかどうかを制御するブール型変数include_hiddenを導入しています。

ファイル検索の動作のカスタマイズ

カスタムルールを指定してファイルやディレクトリを含めるか除外する関数を作成することで、ファイル検索の動作をさらにカスタマイズすることができます。

import os
 
def get_file_list(directory_path, include_hidden=False, allowed_extensions=None, excluded_extensions=None):
    all_items = os.listdir(directory_path)
    file_list = []
 
    for item in all_items:
        item_path = os.path.join(directory_path, item)
        if os.path.isfile(item_path):
            if allowed_extensions:
                if any(item.endswith(ext) for ext in allowed_extensions):
                    file_list.append(item)
            elif excluded_extensions:
                if not any(item.endswith(ext) for ext in excluded_extensions):
                    file_list.append(item)
            else:
                file_list.append(item)
        elif include_hidden or not item.startswith('.'):
            file_list.append(item)
 
    return file_list
 
# 使用例
directory_path = '/path/to/directory'
file_list = get_file_list(directory_path, include_hidden=False, allowed_extensions=['.txt', '.py'])
print(file_list)

この例では、get_file_list()関数を使用して、隠しファイルとディレクトリを含めるかどうか、含めるまたは除外するファイル拡張子を指定することができます。これにより、特定の要件に基づいてファイルリストを柔軟かつカスタマイズ可能な方法で取得することができます。

os.listdir()とos.path.join()の組み合わせ

os.path.join()を使用して完全なファイルパスを構築する

os.listdir()から取得したファイルリストを扱う場合、完全なファイルパスを構築する必要があります。この目的で、os.path.join()関数を使用することができます。

import os
 
directory_path = '/path/to/directory'
file_list = os.listdir(directory_path)
full_file_paths = [os.path.join(directory_path, filename) for filename in file_list]
print(full_file_paths)

この例では、リスト内包表記を使用してファイルリストを反復処理し、個々のファイル名を結合して完全なファイルパスを構築します。結合にはos.path.join()を使用します。

ディレクトリの反復処理とファイルリストの構築

os.listdir()os.path.join()を組み合わせて、ファイルリストをより効率的な方法で構築することができます。

import os
 
def get_file_list(directory_path):
    file_list = []
    for filename in os.listdir(directory_path):
        file_path = os.path.join(directory_path, filename)
        if os.path.isfile(file_path):
            file_list.append(file_path)
    return file_list
 
directory_path = '/path/to/directory'
all_files = get_file_list(directory_path)
print(all_files)

この例では、os.listdir()os.path.join()を組み合わせて、より効率的な方法でファイルリストを構築しています。 リストはPythonで最も基本的なデータ構造の1つです。異なるデータ型の項目で構成された順序付きのコレクションです。角括弧 "[]" を使用してリストを作成し、カンマで項目を区切ります。

fruits = ['apple', 'banana', 'cherry']
print(fruits)  # 出力: ['apple', 'banana', 'cherry']

インデックスを使用してリスト内の個々の要素にアクセスすることもできます。インデックスは0から始まります。

print(fruits[0])  # 出力: 'apple'
print(fruits[1])  # 出力: 'banana'

リストの終わりから要素にアクセスするために負のインデックスを使用することもできます。

print(fruits[-1])  # 出力: 'cherry'
print(fruits[-2])  # 出力: 'banana'

リストはスライシング、連結、変更など、さまざまな操作をサポートしています。

# スライシング
print(fruits[1:3])  # 出力: ['banana', 'cherry']
 
# 連結
more_fruits = ['orange', 'kiwi']
all_fruits = fruits + more_fruits
print(all_fruits)  # 出力: ['apple', 'banana', 'cherry', 'orange', 'kiwi']
 
# 変更
fruits[0] = 'pear'
print(fruits)  # 出力: ['pear', 'banana', 'cherry']

タプル

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

point = (3, 4)
print(point)  # 出力: (3, 4)
print(point[0])  # 出力: 3
print(point[1])  # 出力: 4

タプルは座標やデータベースのレコードなど、固定の値セットを格納する場合に有用です。

辞書

辞書はキーと値のペアの順序なしのコレクションです。波括弧 "" を使用して定義され、キーと値はコロンで区切られます。

person = {
    'name': 'John Doe',
    'age': 35,
    'occupation': 'ソフトウェアエンジニア'
}
print(person)  # 出力: {'name': 'John Doe', 'age': 35, 'occupation': 'ソフトウェアエンジニア'}

辞書内の値にはキーを使用してアクセスすることができます。

print(person['name'])  # 出力: 'John Doe'
print(person['age'])  # 出力: 35

辞書はリストや他の辞書を含め、さまざまなタイプのデータを格納するために使用できます。

person = {
    'name': 'John Doe',
    'age': 35,
    'hobbies': ['reading', 'hiking', 'photography'],
    'address': {
        'street': '123 Main St',
        'city': 'Anytown',
        'state': 'CA'
    }
}
 
print(person['hobbies'])  # 出力: ['reading', 'hiking', 'photography']
print(person['address']['city'])  # 出力: 'Anytown'

集合

集合は一意の要素の順序なしのコレクションです。波括弧 "" を使用して定義され、要素はカンマで区切られます。

colors = {'red', 'green', 'blue'}
print(colors)  # 出力: {'red', 'green', 'blue'}

集合を使用して、和集合、積集合、差を計算するなど、さまざまな操作を行うことができます。

colors1 = {'red', 'green', 'blue'}
colors2 = {'green', 'yellow', 'orange'}
 
# 和集合
all_colors = colors1 | colors2
print(all_colors)  # 出力: {'red', 'green', 'blue', 'yellow', 'orange'}
 
# 積集合
common_colors = colors1 & colors2
print(common_colors)  # 出力: {'green'}
 
# 差
unique_colors1 = colors1 - colors2
print(unique_colors1)  # 出力: {'red', 'blue'}

制御フロー

条件文

Pythonでは、特定の条件に基づいてプログラムのフローを制御するために条件文を使用することができます。

if-elif-else 文は条件ロジックを実装するための最も一般的な方法です。

age = 25
if age < 18:
    print("あなたは未成年です。")
elif age < 65:
    print("あなたは成人です。")
else:
    print("あなたはシニアです。")

また、三項演算子を使用することもできます。これは簡単な if-else 文を短縮して書くための方法です。

is_student = True
status = "学生" if is_student else "非学生"
print(status)  # 出力: "学生"

ループ

Pythonのループは、コードブロックを繰り返し実行するための仕組みです。最も一般的なループのタイプは for ループと while ループです。

for ループは、リストや文字列などのシーケンスを繰り返し処理するために使用されます。

fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:
    print(fruit)

while ループは、特定の条件が真の間、コードブロックを繰り返し実行するために使用されます。

count = 0
while count < 5:
    print(count)
    count += 1

また、break 文や continue 文を使用してループのフローを制御することもできます。

for i in range(10):
    if i == 5:
        break
    print(i)  # 出力: 0 1 2 3 4
 
for j in range(10):
    if j % 2 == 0:
        continue
    print(j)  # 出力: 1 3 5 7 9

関数

Pythonの関数は、特定のタスクを実行するための再利用可能なコードブロックです。関数は def キーワードを使用して定義されます。

def greet(name):
    print(f"こんにちは、{name}!")
 
greet("Alice")  # 出力: "こんにちは、Alice!"

関数は return 文を使用して値を返すこともできます。

def add_numbers(a, b):
    return a + b
 
result = add_numbers(3, 4)
print(result)  # 出力: 7

また、デフォルト引数や可変長引数を持つ関数も定義することができます。

def print_info(name, age=30, *args):
    print(f"名前: {name}")
    print(f"年齢: {age}")
    print("追加情報:")
    for arg in args:
        print(arg)
 
print_info("John", 35, "ソフトウェアエンジニア", "ハイキングが好きです")

モジュールとパッケージ

Pythonでは、コードをモジュールとパッケージに整理して、モジュールとパッケージを使用してコードをよりモジュラーで再利用可能にすることができます。

モジュールは、関数、クラス、変数などを含む単一のPythonファイルです。import 文を使用してモジュールをインポートすることができます。

import math
print(math.pi)  # 出力: 3.141592653589793

また、from キーワードを使用してモジュールから特定のアイテムをインポートすることもできます。

from math import sqrt
print(sqrt(16))  # 出力: 4.0

パッケージは関連するモジュールの集合です。パッケージは、__init__.py ファイルでパッケージを定義するディレクトリに組織化されています。

my_package/
__init__.py
module1.py
module2.py

```python
# パッケージからアイテムをインポートすることができます。
import my_package.module1
result = my_package.module1.my_function()

例外処理

Pythonの例外処理メカニズムを使用すると、ランタイムエラーや予期しない状況をコードで処理できます。

try-except文を使用して例外をキャッチして処理することができます。

try:
    result = 10 / 0
except ZeroDivisionError:
    print("エラー:ゼロ除算")

複数の例外を処理し、デフォルトのexceptブロックを提供することもできます。

try:
    num = int(input("数字を入力してください:"))
    print(10 / num)
except ValueError:
    print("エラー:無効な入力")
except ZeroDivisionError:
    print("エラー:ゼロ除算")
except:
    print("不明なエラーが発生しました")

raise文を使用して独自の例外を発生させることもできます。

def withdraw(balance, amount):
    if amount > balance:
        raise ValueError("残高不足")
    return balance - amount
 
try:
    new_balance = withdraw(100, 150)
except ValueError as e:
    print(e)

結論

このチュートリアルでは、Pythonにおけるさまざまなデータ構造、制御フロー文、関数、モジュール、例外処理について学びました。これらの概念は、より複雑で堅牢なPythonアプリケーションの構築に不可欠です。提供された例を練習して実験し、これらのトピックの理解を固めることを忘れないでください。

[![MoeNagy Dev](https://raw.githubusercontent.com/lynn-mikami/Images/main/moenagy-dev.png)](/) (opens in a new tab)