おもこん

おもこんは「思いつくままにコンピュターの話し」の省略形です

Python初級者のお勉強ノート(20)コマンドラインから起動するプログラムの作成

Pythonを使って、コマンドライン上で動作するスケジュール管理プログラムを作成します。 このプログラムでは以下の機能を実装します:

  • スケジュールの追加
  • スケジュールの表示
  • スケジュールの削除

プログラム名はsch.py(schはscheduleの最初の3文字)で、コマンドラインからシンプルに操作できるよう設計します。

スケジュール管理プログラムの設計

今回作成するプログラムの特徴は以下の通りです:

  1. コマンドライン引数で操作:
    • -a: スケジュールの追加
    • -l: スケジュールの一覧表示
    • -d: スケジュールの削除
  2. データの保存と読み込み:
    • JSONファイルを利用します。
  3. シンプルな構造:
    • すべての関数は簡潔で明確な役割を持たせます。

argparseモジュールとは?

argparseモジュールは、Pythonコマンドライン引数を解析するための標準ライブラリです。 このモジュールを使うと、プログラムをコマンドラインから柔軟に操作できるようになります。

argparseの基本的な使い方

1. 引数パーサーを作成する

argparse.ArgumentParserを使って、引数を処理するための「引数パーサー」を作成します。 引数パーサーは、ArgumentParserクラスのインスタンスです。 このパーサーは、コマンドライン引数を解釈し、プログラムで使いやすい形に変換する役割を持っています。

import argparse

parser = argparse.ArgumentParser(description="コマンドライン引数の例")
  • description引数: プログラムの概要を説明します。この説明は、ユーザーが--helpを指定したときに表示されます。

例えば、このコードを含むスクリプトpython script.py --helpで実行すると、以下のようなヘルプメッセージが表示されます:

usage: script.py [-h]

コマンドライン引数の例
2. 引数を定義する

次に、プログラムが受け取る引数を定義します。「引数パーサー」のadd_argumentメソッドを使って、引数の名前や動作を指定します。

parser.add_argument("-a", help="スケジュールを追加する")
  • -a:
    • コマンドライン引数のショートスタイル(短い名前)。
    • 実際には、ユーザーが-aに続けて値を指定します(例: -a value)。
  • help:
    • 引数の説明です。--helpを実行したときに、この引数がどのような目的で使われるのか表示されます。
3. 引数を解析する

最後に、コマンドラインから渡された引数を解析し、その値を取得します。これにはparse_argsメソッドを使用します。

args = parser.parse_args()
  • argsは、ユーザーが指定した引数を保持するオブジェクトです。
  • 属性として各引数にアクセスできます(例: args.a)。

例えば、次のようなコマンドを実行した場合:

> py script.py -a "My Schedule"

プログラム内でargs.aを確認すると、"My Schedule"という文字列が取得できます。

プログラム全体のコード

以下に、sch.pyのコードを示します。 プログラムの説明はコードの後にあります。 このプログラムは、スケジュールの追加、一覧表示、削除の3つの機能を持っています。

import argparse
import json
import os

DATA_FILE = "schedule.json"

def load_data():
    """スケジュールデータをロードします"""
    if os.path.exists(DATA_FILE):
        with open(DATA_FILE, "r") as f:
            return json.load(f)
    else:
        return []

def save_data(data):
    """スケジュールデータを保存します"""
    with open(DATA_FILE, "w") as f:
        json.dump(data, f, indent=4)

def add_schedule(date, time, title):
    """スケジュールを追加します"""
    d = load_data()
    s = {"id": len(d) + 1, "date": date, "time": time, "title": title}
    d.append(s)
    save_data(d)
    print(f"スケジュールを追加しました: {date} {time} - {title}")

def list_schedule(date):
    """指定された日付のスケジュールを一覧表示します"""
    d = load_data()
    new_id = d[-1]["id"] + 1 if d else 1
    s = {"id": new_id, "date": date, "time": time, "title": title}
    if l:
        print(f"スケジュール一覧 ({date}):")
        for s in l:
            print(f"{s['id']}. {s['time']} - {s['title']}")
    else:
        print(f"{date}のスケジュールはありません。")

def delete_schedule(schedule_id):
    """指定されたIDのスケジュールを削除します"""
    d = load_data()
    d = [s for s in d if s["id"] != schedule_id]
    save_data(d)
    print(f"スケジュール(ID: {schedule_id})を削除しました。")

def main():
    """メイン関数: コマンドライン引数を解析し、処理を分岐します"""
    parser = argparse.ArgumentParser(description="スケジュール管理プログラム")
    parser.add_argument("-a", nargs=3, metavar=("DATE", "TIME", "TITLE"), help="スケジュールを追加します")
    parser.add_argument("-l", metavar="DATE", help="スケジュールを一覧表示します")
    parser.add_argument("-d", type=int, metavar="ID", help="スケジュールを削除します")
    
    args = parser.parse_args()
    
    if args.a:
        add_schedule(args.a[0], args.a[1], args.a[2])
    elif args.l:
        list_schedule(args.l)
    elif args.d:
        delete_schedule(args.d)
    else:
        parser.print_help()

if __name__ == "__main__":
    main()

プログラムの説明

定数

定数とは常に同じ値を持ち、値を変えない変数のことをいいます。 Pythonは、言語的に定数を持っていないので、変数を定数としても使います。

  • すべて大文字で記述: DATA_FILEのように、大文字の名前が慣習的に定数を意味する。
  • 変更しない前提で利用: 定数として扱う変数は、コード中で変更されないように設計する。

すなわち、プログラマーがこのようなルールを守ることで、定数を使えるようになります。 DATA_FILEは実際は変数なので値を書き換えられますが、それをすると混乱の元になるので、しないようにしてください。

関数の説明コメント

関数の説明がdef文の次の行にあります。 この説明に使われているのは、3個のダブルクォート(トリプルクォート)で囲んだ文字列です。 ダブルクォートの代わりにシングルクォートを使うこともできます。 トリプルクォートの文字列は複数行に渡って記述することができます。

プログラムの説明はコメント文(ハッシュマーク#以後がコメントになる)を使うのが普通ですが、ここで文字列を使っている理由を説明します。

この文字列はDocstringと呼ばれます。 Docstringは、Pythonのコードに関する説明やドキュメントを記述するための文字列です。 クラス、関数、メソッド、モジュールなどの冒頭に記述され、コードの動作や使い方を明確に伝えるために利用されます。 Docstringにはトリプルクォートを使います。

  • この文字列は、関数などの__doc__属性に保存される
  • Docstringはhelp関数で参照することができる
  • ドキュメント生成ツール(例: Sphinx)で利用される

ハッシュマークのコメント文を使うと、そのコメントは実行時に無視されてしまうので、関数などの説明には必ず文字列を使ってください。 ドキュメント生成ツールについては、今後別の記事で説明する予定です。

load_data()save_data()

  • 役割: スケジュールデータを読み込みまたは保存します。ファイル形式はJSONです。
  • ポイント:

add_schedule(date, time, title)

  • 役割: 新しいスケジュールをデータに追加します。
  • ポイント:
    • ローカル変数dを使ってスケジュールリストを管理。
    • sは新規スケジュールを表す辞書。
    • 新しいidの作成部分は次の「条件式」の項を参照。

条件式

Pythonには式の中に条件を含む「条件式」があります。 C言語三項演算子(A ? B : C)と同等のものですが、構文が違います。

<Trueのときの値> if <条件> else <Falseのときの値>

この構文は次のように動作します。

  • <条件>を評価。
  • 条件がTrueの場合、<Trueのときの値>が選ばれ、その値が返される。
  • 条件がFalseの場合、<Falseのときの値>が選ばれ、その値が返される。

if文との違い

  • 通常のif文は、条件に応じてスイート内のコードを実行する。文であって式ではないので、値を返すことはしない。
  • 条件式は値を返す。同様のことはif文を使ってもできるが、複数行にわたり長くなる。条件式を使えば1行でシンプルに記述できる。

プログラム中の条件式の動作

new_id = d[-1]["id"] + 1 if d else 1

スケジュールのリストdを評価する。 このとき、リストが空ならFalse、そうでなければTrueと判定します(このあと詳しく説明)。 したがって

  • リストが空でなければ、リストの最後のidに1を加えたものをnew_idに代入する。
  • リストが空ならば、1をnew_idに代入する。

Pythonのif文などの式評価では、bool型オブジェクト(TrueとFalse)以外も使えます。 以下の値がFalse(偽)として評価されます(「Falsy」とも呼ばれる)。

  • None
  • 数値の0(0, 0.0, 0jなど)
  • 空のシーケンス([], "", ())
  • 空のマッピング({})
  • False

それ以外の値はすべてTrue(真)として評価されます(「Truthy」とも呼ばれる)。

list_schedule(date)

  • 役割: 指定された日付のスケジュールを表示します。
  • ポイント:
    • リスト内包表記(後述)を使用して、条件に一致するスケジュールを抽出。
    • 結果が空の場合、適切なメッセージを表示します。

リスト内法表記

Pythonリスト内包表記は、簡潔で読みやすい方法でリストを作成するための構文です。 1行でリストの生成ができます。

リスト内包表記の基本構文

以下が基本的な構文です:

[<式> for <変数> in <イテラブル> if <条件>]  # 条件部分は省略可能
  • <式>: リストに追加される要素を表します。
  • <変数>: forループで使われる変数です。
  • <イテラブル>: リストや文字列、範囲などの反復可能オブジェクトです。
  • if <条件>: 任意の条件を指定できます。この条件を満たす場合のみリストに要素が追加されます。

sch.pyでは、リスト内包表記を使ってスケジュールを抽出しています。

l = [s for s in d if s["date"] == date]
  • s for s in d:
    • リストdの各要素(s)を走査します。
  • if s["date"] == date:
    • スケジュールの"date"が指定されたdateと一致する場合のみ、sをリストに追加します。
  • 結果:
    • 条件に一致するスケジュールのリストが作成されます。

同じ処理を通常のforループで書くこともできますが、1行では書けません。

l = []
for s in d:
    if s["date"] == date:
        l.append(s)

リスト内包表記を使うことで、これを1行で簡潔に記述できます。

リスト内包表記の利点

  1. 簡潔で読みやすい:
    • 1行でリストを生成でき、コードが短くなります。
  2. 高速:
    • 内部で最適化されているため、通常のforループより高速に動作する場合があります。
  3. 柔軟性:
    • 条件式や複雑な処理を組み込むことができます。

リスト内包表記は糖衣構文として実装されています。 ここで、糖衣構文について簡単に説明します。

糖衣構文とは、プログラムの処理内容を簡潔に書けるようにするための表記方法です。 糖衣構文は新しい文法を追加したわけではなく、実際にはそれを同等な通常の構文に変換してPythonが解釈する仕組みです。 例えば、sch.pyの糖衣構文は、forループに書き直してPythonに解釈、実行されます。

リスト内包表記

l = [s for s in d if s["date"] == date]

展開されたforループ

l = []
for s in d:
    if s["date"] == date:
        l.append(s)

糖衣構文の特徴

    1. プログラムの本質には影響を与えない:
    2. 糖衣構文は、単にコードを簡潔に記述できる手段であり、実行される処理内容は通常の構文と同じです。
    1. 新しい機能ではなく既存の仕組みの簡略化:
    2. 糖衣構文は新しいPythonの文法ではなく、既存の機能を別の形で書きやすくしたものです。
    1. 例: リスト内包表記:
    2. Pythonがリスト内包表記をサポートするのは、forループとif文を簡潔に記述できるようにするためです。

なお、糖衣構文はPythonに組み込まれているもので、プログラマーが糖衣構文を作ることはできません。

delete_schedule(schedule_id)

  • 役割: 指定されたIDのスケジュールを削除します。
  • ポイント:
    • 削除後のデータリストを更新する際にもリスト内包表記を活用。

main()

  • 役割: コマンドライン引数を解析し、適切な関数を呼び出します。
  • ポイント:
    • -a, -l, -dといったオプションを指定し、それに応じた処理を実行。argparseモジュールの補足説明は次の項で行います。
    • 引数が不足している場合はヘルプメッセージを表示します。

argparseモジュールについての補足説明

1. -a 引数
parser.add_argument("-a", nargs=3, metavar=("DATE", "TIME", "TITLE"), help="スケジュールを追加します")

オプションの意味

  • -a:

    • ショートオプション。コマンドライン-aを指定することで、この引数を利用できます。
  • nargs=3:

    • この引数は3つの値(引数)を必要とします。
    • たとえば、python sch.py -a 2023-12-10 14:00 "Meeting"とすると、2023-12-1014:00Meetingがそれぞれ別々に渡されます。
  • metavar=("DATE", "TIME", "TITLE"):

    • ヘルプメッセージに表示されるプレースホルダー名です。
    • コマンドライン引数として何を入力するべきかを示します。
    • 例えば、python sch.py --helpで次のように表示されます:
-a DATE TIME TITLE  スケジュールを追加します
  • help="スケジュールを追加します":
    • ヘルプメッセージに表示されるこの引数の説明です。
2. -l 引数
parser.add_argument("-l", metavar="DATE", help="スケジュールを一覧表示します")

オプションの意味

  • -l:

    • ショートオプション。コマンドライン-lを指定することで、この引数を利用できます。
  • metavar="DATE":

    • ヘルプメッセージで、この引数に入力するべき値をDATEとして表示します。
    • 例えば、python sch.py --helpで次のように表示されます:
-l DATE  スケジュールを一覧表示します
  • help="スケジュールを一覧表示します":
    • ヘルプメッセージに表示されるこの引数の説明です。
3. -d 引数
parser.add_argument("-d", type=int, metavar="ID", help="スケジュールを削除します")

オプションの意味

  • -d:

    • ショートオプション。コマンドライン-dを指定することで、この引数を利用できます。
  • type=int:

    • この引数に指定される値を整数型に変換します。
    • ユーザーが文字列や浮動小数点数などの無効な値を入力すると、自動的にエラーになります。
  • metavar="ID":

    • ヘルプメッセージで、この引数に入力するべき値をIDとして表示します。
    • 例えば、python sch.py --helpで次のように表示されます:
-d ID  スケジュールを削除します
  • help="スケジュールを削除します":
    • ヘルプメッセージに表示されるこの引数の説明です。
まとめ
  1. nargs:

    • 必要な引数の個数を指定します(例: nargs=3は3つの値が必要)。
  2. metavar:

    • ヘルプメッセージで引数の説明をわかりやすくするためのプレースホルダーを設定します。
  3. type:

    • 引数の型を指定し、不適切な型の入力を自動的にチェックします。
  4. help:

    • 引数の用途を説明する文字列で、--help実行時に表示されます。

実行例

  1. スケジュールの追加
> py sch.py -a 2023-12-10 14:00 "ミーティング"
スケジュールを追加しました: 2023-12-10 14:00 - ミーティング
  1. スケジュールの一覧表示
> py sch.py -l 2023-12-10
スケジュール一覧 (2023-12-10):
1. 14:00 - ミーティング
  1. スケジュールの削除
> py sch.py -d 1
スケジュール(ID: 1)を削除しました。

まとめ

本記事では、Pythonを使ったスケジュール管理プログラムを作成しました。

  1. argparseモジュールを使ったコマンドライン引数の処理
  2. JSONファイルを使ったデータの永続化
  3. 関数を分割して明確に役割を定義する設計
  4. 定数、Docstring、リスト内包表記

このプログラムは、コマンドラインツールの作成方法の例となります。 しかし、これだけで十分なわけではなく、テスト、パッケージ化なども必要です。 それらは、次回以降の記事で取り上げたいと思います。

Python初級者のお勉強ノート(19)csvモジュール

PythonCSVファイルを扱う方法:csvモジュールの基本と応用

CSVファイルは、表形式のデータをテキスト形式で保存するための一般的なフォーマットです。 この記事では、Pythoncsvモジュールを使用してCSVファイルを扱う方法について説明します。 CSVデータを効率よく操作するためのプログラム例も紹介します。

CSVとは何か?

CSV(Comma-Separated Values)は、表形式のデータをカンマ(,)区切りで記述したテキスト形式のデータフォーマットです。 行ごとにデータを区切り、各行は複数の値を含みます。たとえば以下のような形式が一般的です。

都道府県,人口,面積,企業数,学校数
東京都,13929286,2194,104934,1224
大阪府,8839469,1904,71283,903

CSVの特徴: - テキスト形式で軽量。 - 表計算ソフトやデータベースと容易にやり取り可能。 - 読み書きが簡単だが、構造が複雑なデータには向かない。

表形式のデータのPythonでの実装方法

Pythonで表形式のデータを扱うには主に以下の2つの方法があります。 その具体例は、後述のプログラム例を参考にしてください。

  1. 二重リスト(リストのリスト)

    • 各行をリストとして、全体をリストに格納。先頭行がタイトルの場合が多いが、タイトルなしで本体のみのCSVでも可能。
    • メリット: シンプルで、データの順序がそのまま反映される。
    • デメリット: 各値にアクセスする際、インデックスを使用するため、列名がないと可読性が低下。
  2. 辞書(リストの辞書)

    • 各行を辞書で表現し、全体をリストに格納。CSVの先頭行がタイトル行であることが必要。
    • メリット: 各値に列名でアクセス可能。
    • デメリット: 辞書化する手間がかかる。

Pythoncsvモジュールの使い方

csvモジュールは、PythonCSVファイルを扱うための標準モジュールです。 以下のプログラム例では、都道府県ごとのデータをCSVファイルに保存し、それを二重リスト形式および辞書形式で読み込みます。

プログラム例1: 二重リスト形式での保存と読み込み

import csv

# データ
data = [
    ["都道府県", "人口", "面積", "企業数", "学校数"],
    ["東京都", 13929286, 2194, 104934, 1224],
    ["大阪府", 8839469, 1904, 71283, 903],
]

# CSVファイルへの保存
with open("data.csv", "w", newline="", encoding="utf-8") as f:
    writer = csv.writer(f)
    writer.writerows(data)

# CSVファイルの読み込み
with open("data.csv", "r", encoding="utf-8") as f:
    reader = csv.reader(f)
    result = []
    for row in reader:
        result.append(row)

print(result)

説明

  • ファイルをオープンするときにnewline=""を必ず指定する。これは、csvモジュール内で改行を出力するので、余計な改行が入らないようにするためである。
  • csv.writer: CSVファイルへの書き込みを行うwriterオブジェクトを返す。
  • writerows: 二重リストを一括でcsvファイルに書き込む。writerオブジェクトのメソッド。
  • csv.reader: CSVファイルの内容をリスト形式で読み込むreaderオブジェクト。
  • readerオブジェクトはfor文のなかで、csvから読み込んだ行を繰り返し変数に代入する。このように、繰り返し処理のできるオブジェクトは「イテラブル」と呼ばれる。
  • result.append(row): appendはリストのメソッドで、そのリストの最後に引数のデータを付け加える。

出力例:

[['都道府県', '人口', '面積', '企業数', '学校数'], ['東京都', '13929286', '2194', '104934', '1224'], ['大阪府', '8839469', '1904', '71283', '903']]

プログラム例2: 辞書形式での保存と読み込み

import csv

# データ
data = [
    {"都道府県": "東京都", "人口": 13929286, "面積": 2194, "企業数": 104934, "学校数": 1224},
    {"都道府県": "大阪府", "人口": 8839469, "面積": 1904, "企業数": 71283, "学校数": 903},
]

# CSVファイルへの保存
with open("data_dict.csv", "w", newline="", encoding="utf-8") as f:
    fieldnames = ["都道府県", "人口", "面積", "企業数", "学校数"]
    writer = csv.DictWriter(f, fieldnames=fieldnames)
    writer.writeheader()  # ヘッダー行を書き込む
    writer.writerows(data)

# CSVファイルの読み込み
with open("data_dict.csv", "r", encoding="utf-8") as f:
    reader = csv.DictReader(f)
    result = []
    for row in reader:
        result.append(row)

print(result)

説明

  • csv.DictWriter: 辞書形式のデータをCSVファイルに書き込むオブジェクトを生成する。csv.readerとの違いは後述
  • fieldnames: 列名(の順番)を指定するリスト。
  • writeheader: ヘッダー行をファイルに書き込む。
  • csv.DictReader: 辞書形式でCSVファイルを読み込むオブジェクトを生成。

出力例:

[{'都道府県': '東京都', '人口': '13929286', '面積': '2194', '企業数': '104934', '学校数': '1224'}, {'都道府県': '大阪府', '人口': '8839469', '面積': '1904', '企業数': '71283', '学校数': '903'}]

csv.readerとcsv.DictReaderの違い

この2つは「小文字だけ」と「大文字+小文字」の違いがありますが、その背景には次のような違いがあります。

  • csv.readerは関数である。そして、 readerオブジェクトを返す。
  • csv.DictReaderはクラスである。クラスなので大文字からはじまる(そしてキャメルケースである)。
  • csv.DictReader()はDictReaderのインスタンスを生成する。インスタンスの生成方法は以前のブログを参照。

両者とも、オブジェクト(インスタンス)を返すのは同じなのだが、その過程が、関数呼び出しなのか、インスタンス生成なのかが違います。 細かいことになりますが、大文字が使われたり、使われなかったりの理由は、そういうことなのです。

まとめ

本記事では、PythonCSVファイルを扱う方法について学びました。

  1. CSVとは何か

    • 表形式データを扱う軽量フォーマット。
  2. 表形式のデータのPythonでの実装方法

    • 二重リスト形式: シンプルだが、列名でのアクセスができない。
    • 辞書形式: 可読性が高いが、若干のオーバーヘッドあり。
  3. csvモジュールの使い方

    • csv.writercsv.DictWriterCSVファイルにデータを保存。
    • csv.readercsv.DictReaderでデータを読み込む。

Python初級者のお勉強ノート(18)requestsモジュール

前回の記事ではJSONについて学びました。 今回はその応用として、APIを利用してデータを取得する方法を学びます。 具体的には、Pythonrequestsモジュールを使って、天気予報APIであるOpen-Meteoから気象データを取得するプログラムを作成します。

requestsモジュールの概要

requestsモジュールは、PythonでHTTPリクエストを簡単に扱うためのライブラリです。 直感的で使いやすいインターフェースを持ち、GETリクエストやPOSTリクエストをはじめとしたさまざまな操作をサポートします。

requestsモジュールのインストール方法

requestsモジュールはPythonの標準ライブラリではないため、事前にインストールが必要です。 以下のコマンドを実行してください。

pip install requests

HTTPの概要

HTTP(Hypertext Transfer Protocol)は、ウェブ上でデータをやり取りするためのプロトコルプロトコルとはやり取りのルール)です。 このやり取りをするのは、クライアントとサーバです。 例えばあなたが、ウェブサイトを見るときは、あなたのPCがクライアント、ウェブサイトのPCがサーバです。 HTTPでは、まずクライアントがサーバにリクエスト(要求)を出し、サーバがそれに応答します。

主に以下のリクエストメソッドが使用されます。

  • GET: サーバーからデータを取得する。
  • POST: サーバーにデータを送信する。
  • PUT: サーバー上のデータを更新する。
  • DELETE: サーバー上のデータを削除する。

ここでは、最も基本的なGETリクエストを使用してデータを取得します。

GETリクエストの問い合わせと応答プロセス

  1. クライアントがサーバのURLにGETリクエストを送信します。
  2. サーバーがリクエストを処理し、結果(レスポンス)を返します。
  3. クライアントはレスポンスからデータを取得して処理します。

httpbin.orgrequestsモジュールを使ったテスト

httpbin.orgは、HTTPリクエストやレスポンスの動作を確認するためのテストサービスです。 HTTPのサーバ側になります。 これを使ってrequestsモジュールの使い方を学びましょう。

import requests

url = "https://httpbin.org/get"
response = requests.get(url)

data = response.json()
print(f"取得データ: {data}")
  • requestsモジュールをインポートする。
  • getメソッドを使って、サーバにアクセスし、そのレスポンス(Responseオブジェクト)を変数responseに代入する。
  • このオブジェクトのjsonメソッドは、レスポンスがjsonに基づいている場合に使う。jsonメソッドはjsonを辞書型やリストに変更し、それを返す。

requestsモジュールで良く使うメソッドは、この記事の最後にまとめておきますので、参照してください。

Open-Meteoの概要

Open-Meteoは、無料で利用可能な気象データAPIです。以下のようなデータを取得できます。

  • 気温: 地上2メートルの気温。
  • 降水量: 1時間あたりの降水量。
  • 風速・風向: 地上10メートルの風速と風向。
  • 日射量: 太陽放射エネルギー量。

詳しいことは、Open-Meteoのウェブサイトを参照して下さい。

Open-Meteoが返すJSONデータの説明

Open-MeteoのAPIから取得したデータは、以下のようなJSON形式で返されます。

{
    'latitude': 35.676624,
    'longitude': 139.69112,
    'generationtime_ms': 0.07390975952148438,
    'utc_offset_seconds': 32400,
    'timezone': 'Asia/Tokyo',
    'timezone_abbreviation': 'JST',
    'elevation': 40.0,
    'daily_units':
        {
            'time': 'iso8601',
            'temperature_2m_max': '°C',
            'temperature_2m_min': '°C',
            'precipitation_sum': 'mm',
            'windspeed_10m_max': 'km/h',
            'wind_direction_10m_dominant': '°',
            'shortwave_radiation_sum': 'MJ/m²'
        },
    'daily':
        {
            'time': ['2024-11-01'],
            'temperature_2m_max': [21.2],
            'temperature_2m_min': [10.5],
            'precipitation_sum': [5.9],
            'windspeed_10m_max': [13.2],
            'wind_direction_10m_dominant': [345],
            'shortwave_radiation_sum': [11.03]
        }
}

実用プログラム例: Open-Meteoで東京の気象データを取得

以下のプログラムは、東京(緯度: 35.6895、経度: 139.6917)の2024年11月1日の気象データを取得し、最高気温や降水量などを箇条書きで出力します。

import requests

url = "https://archive-api.open-meteo.com/v1/archive"

params = {
    "latitude": 35.6895,
    "longitude": 139.6917,
    "daily": "temperature_2m_max,temperature_2m_min,precipitation_sum,windspeed_10m_max,wind_direction_10m_dominant,shortwave_radiation_sum",
    "timezone": "Asia/Tokyo",
    "start_date": "2024-11-01",
    "end_date": "2024-11-01"
}

response = requests.get(url, params=params)
data = response.json()

# データの整理
daily = data["daily"]
temperature_max = daily["temperature_2m_max"][0]
temperature_min = daily["temperature_2m_min"][0]
precipitation_sum = daily["precipitation_sum"][0]
windspeed = daily["windspeed_10m_max"][0]
winddirection = daily["wind_direction_10m_dominant"][0]
radiation = daily["shortwave_radiation_sum"][0]

print("2024年11月1日の東京の気象データ:")
print(f"  最高気温: {temperature_max}℃")
print(f"  最低気温: {temperature_min}℃")
print(f"  総降水量: {precipitation_sum}mm")
print(f"  最大風速: {windspeed}km/h, 風向: {winddirection}°")
print(f"  日射量: {radiation}MJ/m²")

プログラムの実行結果

PS > py w.py
2024年11月1日の東京の気象データ:
  最高気温: 21.2℃
  最低気温: 10.5℃
  総降水量: 5.9mm
  最大風速: 13.2km/h, 風向: 345°
  日射量: 11.03MJ/m²
PS >

requestsモジュールのよく使うメソッド

Pythonrequestsモジュールには、HTTPリクエストを送信するための便利なメソッドが用意されています。以下は、よく使うメソッドの解説です。

1. requests.get(url, params=None, **kwargs)

  • 用途: サーバーからデータを取得する(HTTP GETリクエスト)。
  • 主な引数:
    • url: リクエスト先のURL。
    • params: URLクエリパラメータを辞書型で指定。
  • :
response = requests.get("https://httpbin.org/get", params={"key": "value"})
print(response.url)  # https://httpbin.org/get?key=value

2. requests.post(url, data=None, json=None, **kwargs)

  • 用途: サーバーにデータを送信する(HTTP POSTリクエスト)。
  • 主な引数:
    • url: リクエスト先のURL。
    • data: フォームデータ(application/x-www-form-urlencoded形式)。
    • json: JSONデータ(application/json形式)。
  • :
response = requests.post("https://httpbin.org/post", json={"key": "value"})
print(response.json())  # サーバーが受け取ったデータを確認

3. requests.put(url, data=None, **kwargs)

  • 用途: サーバー上のリソースを更新または置換する(HTTP PUTリクエスト)。
  • 主な引数:
    • url: リクエスト先のURL。
    • data: 更新するデータ。
  • :
response = requests.put("https://httpbin.org/put", data={"key": "updated_value"})
print(response.json())

4. requests.delete(url, **kwargs)

  • 用途: サーバー上のリソースを削除する(HTTP DELETEリクエスト)。
  • 主な引数:
    • url: リクエスト先のURL。
  • :
response = requests.delete("https://httpbin.org/delete")
print(response.status_code)  # 200(成功)

5. requests.head(url, **kwargs)

  • 用途: レスポンスヘッダーのみを取得する(HTTP HEADリクエスト)。
  • 主な引数:
    • url: リクエスト先のURL。
  • :
response = requests.head("https://httpbin.org/get")
print(response.headers)

6. requests.patch(url, data=None, **kwargs)

  • 用途: サーバー上のリソースを部分的に更新する(HTTP PATCHリクエスト)。
  • 主な引数:
    • url: リクエスト先のURL。
    • data: 更新するデータ。
  • :
response = requests.patch("https://httpbin.org/patch", data={"key": "patched_value"})
print(response.json())

まとめ

この記事では以下の内容を学びました。

  1. requestsモジュールの概要と基本的な使い方。
  2. HTTP GETリクエストの仕組みとテスト方法。
  3. Open-Meteo APIの利用方法と実用的なプログラム例。

requestsモジュールを使えば、簡単にAPIを利用してデータを取得できます。 Open-MeteoのようなAPIを活用して、様々な情報を入手するプログラムを書くことが可能です。

Python初級者のお勉強ノート(17)jsonモジュール

Pythonを学ぶ上で、データのやり取りや保存方法の基本としてJSON形式を理解することは重要です。 この記事では、Python標準モジュールのjsonを取り上げ、その基本と実用例を解説します。

JSONとは?

JSONJavaScript Object Notation)は、データを簡潔かつ人間が読める形式で表現する軽量なデータフォーマットです。
JSONは、もともとJavaScriptで利用されていましたが、現在ではプログラミング言語を問わず、広く使われています。
特に、APIを介したデータ交換や設定ファイル、データの保存形式として重要な役割を果たしています。

具体的には、次のような特徴があります: - テキスト形式で軽量。 - 構造化されたデータ(リストや辞書のようなもの)を表現可能。 - 人間にも読みやすく、機械が解析しやすい。

JSONの構造と形式

JSONは、次のような基本構造を持ちます:

オブジェクト(Object)

  • { }で囲まれたキーと値のペアの集合。
  • キーは文字列、値は文字列・数値・オブジェクトなど。
{
  "name": "Alice",
  "age": 25,
  "isStudent": false
}

配列(Array)

  • [ ]で囲まれた値のリスト。
  • 値は文字列・数値・オブジェクトなどを含められる。
{
  "colors": ["red", "green", "blue"]
}

JSONで使えるデータ型

  • 文字列: "hello"
  • 数値: 42, 3.14
  • 真偽値: true, false
  • null: null
  • オブジェクト: {...}
  • 配列: [...]

JSONが使われる場面

コンピュータ内部では、Pythonのリスト、辞書、数値などのデータ構造を使い、高速に処理を行うことができます。 これらは文字列ではありませんので、コンピュータ外部にそのまま持ち出せません。 そこで、それらを文字列に変換して、サーバと通信したり、ディスプレイに表示したりします。 この文字列変換には、いくつかの方法が考えられますが、最も簡単なのがJSONです。

JSONは多くの場面で使われています。その例として以下が挙げられます:

  • Web APIとのデータ交換
    クライアントとサーバー間のデータ送受信に使用されます。例えば、天気予報APIや為替レートAPIは、データをJSON形式で提供します。

  • 設定ファイル
    アプリケーションの設定情報を保存する形式として利用されます。例えば、VSCodeの設定ファイル(settings.json)はJSON形式です。

  • データの永続化
    小規模なデータベース代わりに、JSON形式でデータを保存することもあります。

PythonJSONを扱う:jsonモジュール

Pythonの標準モジュールであるjsonを使うと、JSONデータをPythonのデータ型(辞書やリストなど)と相互に変換したり、JSONファイルを操作できます。

jsonモジュールの主な機能

jsonは単純な言い方をすれば、オブジェクトと配列からなるテキストです。 それは、自然にPythonの辞書とリストに対応させることができます。 その他の要素も次の表のように対応させることができます。

JSONの型 Pythonの型
オブジェクト 辞書 (dict)
配列 リスト (list)
文字列 (string) 文字列 (str)
数値 (number) 整数 (int) または浮動小数点数 (float)
真偽値 (true/false) True / False
null None

この表に従って次のような双方向の変換がjsonモジュールではサポートされています。

  1. JSON文字列とPythonデータ型の変換

    • JSON文字列からPythonの辞書やリストに変換。
    • Pythonの辞書やリストをJSON文字列に変換。
  2. JSONファイルの読み書き

    • JSON形式のファイルを読み込んでPythonのデータ型に変換。
    • Pythonのデータ型をJSON形式でファイルに保存。

JSONモジュールでよく使うメソッド

1. json.dumps(obj, **kwargs)

PythonオブジェクトをJSON文字列に変換します。

例:
import json

data = {"name": "Alice", "age": 25}
s = json.dumps(data)
print(s)  # {"name": "Alice", "age": 25}
主な引数:
  • indent: インデントを指定し、読みやすく整形。
  • sort_keys: キーをアルファベット順にソート。
整形した出力:
s = json.dumps(data, indent=4, sort_keys=True)
print(s)

次のように整形されて表示されます。

{
    "age": 25,
    "name": "Alice"
}

2. json.loads(s)

JSON文字列をPythonの辞書やリストに変換します。

例:
s = '{"name": "Alice", "age": 25}'
data = json.loads(s)
print(data["name"])  # Alice

3. json.dump(obj, fp, **kwargs)

PythonオブジェクトをJSON形式でファイルに保存します。

例:
data = {"name": "Alice", "age": 25}

with open('data.json', 'w') as f:
    json.dump(data, f, indent=4)

4. json.load(fp)

JSON形式のファイルをPythonのデータ型に変換して読み込みます。

例:
with open('data.json', 'r') as f:
    data = json.load(f)
print(data)

実用例:JSON形式の設定ファイルを読み書きする

Pythonプログラムで設定を管理する際、JSON形式のファイルを利用すると便利です。

サンプル設定ファイル(config.json

{
  "theme": "dark",
  "fontSize": 14,
  "autoSave": true
}

設定を読み込むプログラム

import json

# 設定ファイルを読み込む
with open('config.json', 'r') as f:
    config = json.load(f)

# 設定を表示
print(f"テーマ: {config['theme']}")
print(f"フォントサイズ: {config['fontSize']}")
print(f"自動保存: {'有効' if config['autoSave'] else '無効'}")

設定を変更して保存するプログラム

# 設定を変更
config['theme'] = 'light'

# 設定ファイルを更新
with open('config.json', 'w') as f:
    json.dump(config, f, indent=4)

まとめ

  1. JSONとは

    • 軽量で人間が読みやすいデータ形式。主にデータ交換や保存に使用される。
  2. Pythonjsonモジュール

    • JSON文字列の変換やファイル操作を簡単に行うための標準モジュール。
  3. よく使うメソッド

    • json.dumps, json.loads: JSON文字列との変換。
    • json.dump, json.load: JSONファイルとの変換。
  4. 実用例

    • 設定ファイルの読み書きやデータの永続化。

Python初級者のお勉強ノート(16)sysモジュール

Pythonsysモジュールは、Pythonインタープリタやその環境に関する情報を提供し、プログラムの挙動を制御する機能を備えています。 このモジュールを使うことで、Pythonスクリプトをより柔軟に制御できます。 本記事では、sysモジュールの基本的な機能を解説します。

sysモジュールとは?

sysモジュールは、Python標準ライブラリの一部で、次のようなタスクをサポートします。

利用するには、以下のようにインポートします。

import sys

sysモジュールの主な機能と使い方

コマンドライン引数の取得

スクリプトコマンドラインから渡された引数を取得する場合に使用します。 これについては、すでに「Python初心者のお勉強ノート(5)コマンドライン引数の参照と例外処理」でも解説していますので、参考にしてください。

sys.argv

リストとしてコマンドライン引数を取得します。リストの0番目はスクリプト名が格納され、それ以降に引数が続きます。

import sys

print("スクリプト名:", sys.argv[0])
if len(sys.argv) > 1:
    print("渡された引数:", sys.argv[1:])
else:
    print("引数はありません")

実行例:

上のプログラムをscript.pyという名前で保存しておきます。

> python script.py arg1 arg2
スクリプト名: script.py
渡された引数: ['arg1', 'arg2']

Pythonインタープリタの情報

sys.version

現在使用しているPythonのバージョン情報を取得します。

sys.platform

現在のOSを示す文字列を取得します。

>>> import sys
>>> sys.version
'3.13.0 (tags/v3.13.0:60403a5, Oct  7 2024, 09:38:07) [MSC v.1941 64 bit (AMD64)]'
>>> sys.platform
'win32'
>>>

標準入出力の操作

sys.stdoutsys.stderr

通常の出力(標準出力)やエラー出力(標準エラー出力)を制御します。これらをカスタマイズすることで、出力先を変更できます。

例: 標準エラー出力にメッセージを出力

import sys

sys.stderr.write("エラーメッセージ\n")
sys.stdin

標準入力を操作できます。 柔軟な入力処理を行う際に役立ちます。

標準入出力については「Python初心者のお勉強ノート(6)標準入力と標準出力、ファイルの読み書き」でも解説していますので、参考にしてください。

プログラムの終了

sys.exit()

プログラムを終了する際に使用します。引数に終了ステータスコードを指定できます。

import sys

print("プログラムを終了します")
sys.exit(0)

0は正常終了を、0以外はエラー終了を意味します。 この値は、プログラムを呼び出した親プロセスに返されます。

パス操作とモジュール検索

sys.path

Pythonがモジュールを検索するパスのリストです。このリストを操作することで、カスタムのモジュール検索パスを追加できます。

import sys

print("モジュール検索パス:")
for p in sys.path:
    print(p)

特定のディレクトリをモジュール検索パスに追加する例:

import sys

sys.path.append('/path/to/custom_modules')

メモリ管理情報

sys.getsizeof()

オブジェクトのメモリ使用量(バイト単位)を取得します。

>>> sys.getsizeof([1,2,3])
88
>>>

まとめ

sysモジュールを使うと、Pythonインタープリタやシステム環境に関する情報を取得し、プログラムの挙動を柔軟に制御できます。 本記事では以下の内容を学びました。

  1. コマンドライン引数の取得
  2. Pythonインタープリタ情報の確認
  3. 標準入出力の操作
  4. プログラムの終了やモジュール検索パスの管理

これらを活用すれば、環境に応じた柔軟なプログラムを作成できます。

Python初級者のお勉強ノート(15)shutilモジュール

Pythonshutilモジュールを使ったファイルとディレクトリ操作の基本

Pythonでファイルやディレクトリの操作を行う際、osモジュールに加えて便利なのがshutilモジュールです。 shutilは、ファイルやディレクトリのコピー、移動、削除、アーカイブ化など、より高レベルな操作を簡単に行うための標準モジュールです。

この記事では、shutilモジュールの基本的な使い方や、具体的なユースケースについて解説します。

shutilモジュールとは?

shutilモジュールは、ファイルやディレクトリの操作を効率化するための機能を提供します。 osモジュールが低レベルなシステム操作に焦点を当てているのに対し、shutilモジュールは高レベルな操作に適しています。

例えば、以下のようなタスクを簡単に実現できます。

基本的な使い方

ファイルやディレクトリのコピー

shutil.copy()

単一のファイルをコピーします。 この関数は、ファイルの内容とパーミッションをコピーしますが、すべてのメタデータをコピーするわけではありません。

以下の例で「source」はコピー元「destination」はコピー先を表します。

import shutil

shutil.copy('source.txt', 'destination.txt')
shutil.copytree()

ディレクトリ全体を再帰的にコピーします。

shutil.copytree('source_dir', 'destination_dir')

ファイルやディレクトリの移動

shutil.move()

ファイルまたはディレクトリを移動します。 この関数は、移動元のファイルを削除し、新しい場所にファイルを作成します。

shutil.move('source.txt', 'new_directory/source.txt')

ファイルやディレクトリの削除

shutil.rmtree()

ディレクトリ全体を削除します。 ディレクトリが空でなくても削除できるため、使用する際は注意が必要です。

shutil.rmtree('directory_to_delete')

ディスク容量の確認

shutil.disk_usage()

ディスクの使用状況(総容量、使用済み容量、空き容量)を取得します。

usage = shutil.disk_usage('/')
print(f"総容量: {usage.total // (1024**3)} GB")
print(f"使用済み: {usage.used // (1024**3)} GB")
print(f"空き容量: {usage.free // (1024**3)} GB")

/Linuxなどの「ルート」、すなわち、そのシステムの入っているディスクのトップディレクトリ、またはディスクそのものを表します。 このプログラムはWindowsでも動きますが、Windowsのシステムの入っているディスクはC:またはC:\\と表します。 Windowsでは、usage = shutil.disk_usage('C:\\')などでも動作します。

ファイルやディレクトリのアーカイブ

shutil.make_archive()

ディレクトリを圧縮してアーカイブを作成し、アーカイブのファイル名を返します。 アーカイブ形式に対応する拡張子を自動的につけます。

この関数には以下の引数があります:

利用可能なアーカイブ形式は次の通りです: - 'zip' - 'tar' - 'gztar'gzip圧縮されたtarアーカイブ) - 'bztar'(bzip2圧縮されたtarアーカイブ) - 'xztar'(xz圧縮されたtarアーカイブ

shutil.unpack_archive()

アーカイブを解凍します。

次の例では、make_archiveで作成し、そのアーカイブを解凍します。

import shutil

# アーカイブを作成
archive_path = shutil.make_archive('example_archive', 'zip', 'source_dir')

# アーカイブを解凍
extract_path = 'extracted_dir'
shutil.unpack_archive(archive_path, extract_path)

このコードでは、source_dirを圧縮してexample_archive.zipを作成し、それをextracted_dirに解凍しています。

応用例: コマンドラインからディレクトリのアーカイブおよび解凍

以下は、コマンドライン引数を使用して指定されたディレクトリをzipアーカイブしたり、アーカイブファイルを解凍したりするスクリプトです。ユーザーは、オプションによって操作を選択できます。

import shutil
import sys
from pathlib import Path

def archive_directory(directory, output_name):
    directory = Path(directory)
    if not directory.is_dir():
        print(f"エラー: {directory} が存在しないか、またはディレクトリではありません")
        return

    # アーカイブ作成
    archive_path = shutil.make_archive(output_name, 'zip', directory)
    print(f"アーカイブを作成しました: {archive_path}")

def extract_archive(archive_file, output_dir):
    archive_file = Path(archive_file)
    output_dir = Path(output_dir)
    
    if not archive_file.exists():
        print(f"エラー: {archive_file} が存在しません")
        return
    
    # アーカイブ解凍
    shutil.unpack_archive(archive_file, output_dir)
    print(f"アーカイブを解凍しました: {output_dir}")

def usage():
    print("使用方法:")
    print("  アーカイブ作成: python script.py +a <ディレクトリ名> <出力ファイル名>")
    print("  アーカイブ解凍: python script.py -a <アーカイブファイル名> <解凍先ディレクトリ>")

if len(sys.argv) != 4:
    usage()
    sys.exit(1)

option = sys.argv[1]
if option == "+a":
    directory = sys.argv[2]
    output_name = sys.argv[3]
    archive_directory(directory, output_name)
elif option == "-a":
    archive_file = sys.argv[2]
    output_dir = sys.argv[3]
    extract_archive(archive_file, output_dir)
else:
    usage()
    sys.exit(1)

使用例

上記のプログラムをar-1.pyという名前で保存します。

ディレクトリのアーカイブ

端末を起動します。 次のコマンドでexample_diroutput_archive.zipとしてアーカイブします。

python ar-1.py +a example_dir output_archive

実行結果: - example_diroutput_archive.zipという名前でアーカイブ化されます。

アーカイブファイルの解凍

次のコマンドでoutput_archive.zipextracted_dirに解凍します。

python ar-1.py -a output_archive.zip extracted_dir

実行結果: - output_archive.zipの内容がextracted_dirというディレクトリに展開されます。

まとめ

本記事では、以下の内容を学びました。

  1. shutilモジュールの概要と基本的な使い方
  2. ファイルやディレクトリのコピー、移動、削除
  3. アーカイブの作成と解凍(形式や引数の詳細を含む)
  4. コマンドラインツールとしてのアーカイブ作成スクリプト

shutilモジュールは、Pythonでファイルやディレクトリを操作する際の強力なツールです。 特にバックアップやアーカイブ化などに役立ちます。

Python初級者のお勉強ノート(14)pathlibモジュール

Pythonでファイルやディレクトリを操作する際、従来はosモジュールがよく使われてきました。 しかし、Python 3.4から導入されたpathlibモジュールは、より直感的で簡潔なコードを提供します。

この記事では、pathlibモジュールの基本を学び、パス操作を効率化する方法を紹介します。

pathlibモジュールとは?

pathlibモジュールは、オブジェクト指向のアプローチでファイルやディレクトリのパスを扱うための標準モジュールです。 これにより、従来の文字列ベースのパス操作に比べ、読みやすくエラーが少ないコードを記述できます。

例えば、以下のような操作が簡単に行えます。

  • ファイル・ディレクトリの存在確認
  • パスの結合
  • 拡張子の取得・変更
  • ファイルの読み書き
  • ディレクトリの作成

モジュールを使用するには、まず以下のようにインポートします。

from pathlib import Path

基本的な使い方

Pathオブジェクトの生成

pathlibの中心となるクラスはPathです。以下のようにして、パスを表すPathオブジェクトを作成します。

from pathlib import Path

p = Path('example_dir/example_file.txt')
print(p)  # example_dir/example_file.txt

ファイルやディレクトリの存在確認

exists()メソッドを使って、パスが存在するか確認できます。

p = Path('example_dir/example_file.txt')
if p.exists():
    print("ファイルが存在します")
else:
    print("ファイルが存在しません")

ディレクトリかファイルかの判定

p = Path('example_dir')

if p.is_dir():
    print("これはディレクトリです")
elif p.is_file():
    print("これはファイルです")

パス操作の便利な機能

ディレクトリやファイル名の取得

pathlibを使うと、親ディレクトリやファイル名など、パスの構成要素を簡単に取得できます。

p = Path('example_dir/example_file.txt')

print(p.parent)  # example_dir
print(p.name)    # example_file.txt
print(p.stem)    # example_file
print(p.suffix)  # .txt

パスの結合

スラッシュ/演算子を使うと、直感的にパスを結合できます。

base = Path('example_dir')
file_path = base / 'example_file.txt'
print(file_path)  # example_dir/example_file.txt

絶対パスの取得

p = Path('example_dir/example_file.txt')
print(p.resolve())  # 絶対パスを表示

ファイルとディレクトリの操作

ディレクトリの作成

mkdir()メソッドでディレクトリを作成します。

p = Path('new_dir')
if not p.exists():
    p.mkdir()
    print(f"{p} を作成しました")

ファイルの読み書き

pathlibにはファイルの内容を直接扱う方法も用意されています。

p = Path('example.txt')

# ファイルに書き込む
p.write_text('こんにちは、Python!')

# ファイルを読み込む
content = p.read_text()
print(content)  # こんにちは、Python!

write_textメソッドを既存のファイルに対して行うと、ファイル内容を消去したうえで引数を書き込みます。 すなわち、上書きをします。

ディレクトリ内のファイル一覧

iterdir()メソッドを使うと、ディレクトリ内のファイルやサブディレクトリを取得できます。

p = Path('example_dir')

for item in p.iterdir():
    print(item)  # 各パスを表示

特定のパターンにマッチするファイルの検索

glob()メソッドを使うと、特定のパターンに一致するファイルやディレクトリを検索できます。

p = Path('example_dir')

# .txtファイルを検索
for file in p.glob('*.txt'):
    print(file)  # 例: example1.txt, example2.txt

glob()では正規表現風の書き方が使えます。例えば、以下のような表現が可能です。

  • *.txt: 拡張子が.txtのすべてのファイル
  • *data*.csv: 名前にdataが含まれるCSVファイル
  • **/*.py: サブディレクトリを含めたすべてのPythonファイル(**再帰的検索)

また、再帰的検索を行う場合はrglob()メソッドを使うこともできます。これにより、同じディレクトリ構造内でさらに柔軟な検索が可能です。

for file in p.rglob('*.py'):
    print(file)  # サブディレクトリを含むすべてのPythonファイルを表示

応用例

ファイルのバックアップ

以下の例は、ファイルを別のディレクトリにバックアップするコードです。

from pathlib import Path
import shutil

def backup_files(src_dir, backup_dir):
    src = Path(src_dir)
    backup = Path(backup_dir)

    # バックアップディレクトリが存在しなければ作成
    if not backup.exists():
        backup.mkdir()

    # ファイルをバックアップ
    for file in src.iterdir():
        if file.is_file():
            shutil.copy(file, backup / file.name)
            print(f"{file.name} をバックアップしました")

# 使用例
backup_files('example_dir', 'backup_dir')

まとめ

本記事では、以下の内容を学びました。

  1. pathlibモジュールの基本的な概要
  2. パス操作(結合、親ディレクトリ、ファイル名取得など)の基本
  3. ファイルやディレクトリの操作(作成、読み書き、存在確認など)
  4. globメソッドを用いたファイル検索とパターン指定
  5. 応用例としてのバックアップスクリプト

pathlibは、従来のosモジュールに比べて直感的で使いやすい方法を提供します。特にパス操作を簡単にするため、これからPythonでファイルやディレクトリを扱う際には、ぜひpathlibを活用してください。