Python入門 第16回:標準ライブラリの使い方

Python入門 第16回:標準ライブラリ Python

Contents

はじめに

これまでの記事では、変数や条件分岐、繰り返し処理、関数、クラスなど、Pythonの基本的な機能を学んできました。

Pythonには、これらの基本機能に加えて、最初から利用できる便利な機能が数多く用意されています。

このような、Pythonをインストールした時点で使用できる機能の集まりを「標準ライブラリ」と呼びます。

標準ライブラリを使用すると、複雑な処理を自分で一から作らなくても、用意されている関数やクラスを利用して簡単に実装できます。

今回は、Pythonの標準ライブラリの中でも、特に使用する機会が多い次の5つを紹介します。

  • math
  • random
  • os
  • pathlib
  • shutil

それぞれのライブラリがどのような場面で使用されるのか、実際のプログラムを見ながら確認していきましょう。


標準ライブラリとは

Pythonの標準ライブラリとは、Python本体と一緒に提供されているライブラリのことです。

例えば、平方根を計算したり、ランダムな数字を作ったり、ファイルをコピーしたりする処理が用意されています。

標準ライブラリは、基本的に追加インストールをしなくても使用できます。

ライブラリを使用するときは、以前の記事で学習したimport文を使用します。

import math

このように記述すると、mathライブラリに含まれている機能をプログラム内で使用できるようになります。

ライブラリ内の関数を使用するときは、次のように記述します。

math.sqrt(25)

mathがライブラリ名、sqrt()がライブラリ内に用意されている関数です。

標準ライブラリを活用することで、プログラムを短く、分かりやすく記述できます。


mathで数学計算を行う

mathは、数学に関する処理を行うための標準ライブラリです。

平方根、切り上げ、切り捨て、三角関数、円周率など、さまざまな数学機能が用意されています。

まずは、mathをインポートします。

import math

平方根を計算する

平方根を計算するときは、sqrt()を使用します。

import math

result = math.sqrt(25)

print(result)

実行結果は次のようになります。

5.0

sqrtは「square root」の略です。

戻り値は、小数を扱うfloat型になります。

import math

print(math.sqrt(2))
print(math.sqrt(100))

実行結果の例です。

1.4142135623730951
10.0

数値を切り上げる

小数を切り上げたい場合は、ceil()を使用します。

import math

number = 3.2

print(math.ceil(number))

実行結果は次のようになります。

4

ceilには「天井」という意味があります。

数値を上方向の整数に丸めると考えると覚えやすいでしょう。

import math

print(math.ceil(1.1))
print(math.ceil(5.8))
print(math.ceil(10.0))

実行結果は次のようになります。

2
6
10

数値を切り捨てる

小数を切り捨てたい場合は、floor()を使用します。

import math

number = 3.8

print(math.floor(number))

実行結果は次のようになります。

3

floorには「床」という意味があります。

数値を下方向の整数に丸める機能です。

import math

print(math.floor(1.9))
print(math.floor(5.2))
print(math.floor(10.0))

実行結果は次のようになります。

1
5
10

円周率を使用する

mathには、円周率を表すpiが用意されています。

import math

print(math.pi)

実行結果は次のようになります。

3.141592653589793

例えば、円の面積は次のように計算できます。

import math

radius = 5
area = math.pi * radius ** 2

print(f"半径{radius}の円の面積は{area}です")

実行結果の例です。

半径5の円の面積は78.53981633974483です

小数点以下の表示桁数を調整したい場合は、f文字列で指定できます。

import math

radius = 5
area = math.pi * radius ** 2

print(f"円の面積は{area:.2f}です")

実行結果は次のようになります。

円の面積は78.54です

:.2fと指定すると、小数点以下2桁で表示できます。

mathの主な機能

mathには、ほかにも次のような機能があります。

機能説明
math.sqrt(x)平方根を計算する
math.ceil(x)小数を切り上げる
math.floor(x)小数を切り捨てる
math.pi円周率を取得する
math.factorial(x)階乗を計算する
math.sin(x)サインを計算する
math.cos(x)コサインを計算する

例えば、5の階乗は次のように計算できます。

import math

print(math.factorial(5))

実行結果は次のようになります。

120

5の階乗は、次の計算を表しています。

5 × 4 × 3 × 2 × 1 = 120

randomでランダムな値を作る

randomは、ランダムな数値を作ったり、リストから要素を無作為に選んだりするための標準ライブラリです。

ゲーム、抽選、テストデータの作成など、さまざまな場面で使用されます。

import random

ランダムな整数を作る

指定した範囲からランダムな整数を作る場合は、randint()を使用します。

import random

number = random.randint(1, 10)

print(number)

実行するたびに、1から10までのいずれかの整数が表示されます。

7

randint(1, 10)では、最初の数字と最後の数字の両方が範囲に含まれます。

つまり、1と10も結果として選ばれる可能性があります。

おみくじを作る

randint()を使用すると、簡単なおみくじを作れます。

import random

number = random.randint(1, 3)

if number == 1:
    print("大吉")
elif number == 2:
    print("中吉")
else:
    print("小吉")

プログラムを実行するたびに、結果が変化します。

リストからランダムに選ぶ

リストの中からランダムに要素を1つ選ぶ場合は、choice()を使用します。

import random

fruits = ["りんご", "みかん", "バナナ", "ぶどう"]

selected_fruit = random.choice(fruits)

print(selected_fruit)

実行結果の例です。

バナナ

先ほどのおみくじも、choice()を使用すると短く記述できます。

import random

results = ["大吉", "中吉", "小吉", "吉", "末吉"]

result = random.choice(results)

print(result)

リストの順番をランダムに並べ替える

リストの順番をランダムに変更したい場合は、shuffle()を使用します。

import random

numbers = [1, 2, 3, 4, 5]

random.shuffle(numbers)

print(numbers)

実行結果の例です。

[4, 1, 5, 2, 3]

shuffle()は、元のリストの並び順を直接変更します。

そのため、次のように戻り値を変数へ代入する必要はありません。

random.shuffle(numbers)

複数の要素をランダムに選ぶ

リストから重複しない複数の要素を選ぶ場合は、sample()を使用します。

import random

members = ["田中", "佐藤", "鈴木", "高橋", "伊藤"]

selected_members = random.sample(members, 2)

print(selected_members)

実行結果の例です。

['鈴木', '田中']

第2引数の2は、選択する要素の数です。

randomを使用するときの注意点

randomは、ゲームや簡単な抽選などには便利ですが、パスワードや認証用の文字列を作る用途には適していません。

セキュリティが重要な乱数を作る場合は、secretsという別の標準ライブラリを使用します。

初心者のうちは、次のように覚えておくとよいでしょう。

  • ゲームや抽選にはrandom
  • パスワードや認証にはsecrets

osでOSやファイルを操作する

osは、OSに関係する処理を行うための標準ライブラリです。

現在のフォルダを確認したり、フォルダを作成したり、ファイル名を変更したりできます。

ここでいうOSとは、Windows、macOS、Linuxなどのことです。

import os

現在の作業フォルダを確認する

現在、Pythonがどのフォルダを基準に動作しているかを確認する場合は、getcwd()を使用します。

import os

current_directory = os.getcwd()

print(current_directory)

Windowsでは、次のような結果が表示されます。

C:\Users\user\Documents

cwdは「current working directory」の略です。

ファイルを読み書きするときに、どのフォルダが基準になっているか分からなくなった場合は、os.getcwd()で確認できます。

フォルダ内のファイルを確認する

フォルダ内にあるファイルやフォルダの一覧を取得する場合は、listdir()を使用します。

import os

files = os.listdir(".")

print(files)

.は、現在のフォルダを表します。

実行結果の例です。

['main.py', 'sample.txt', 'data']

繰り返し処理と組み合わせると、1件ずつ表示できます。

import os

files = os.listdir(".")

for file in files:
    print(file)

フォルダを作成する

新しいフォルダを作成する場合は、mkdir()を使用します。

import os

os.mkdir("data")

このプログラムを実行すると、現在のフォルダ内にdataフォルダが作成されます。

ただし、同じ名前のフォルダがすでに存在するとエラーになります。

import os

if not os.path.exists("data"):
    os.mkdir("data")

os.path.exists()は、指定したファイルやフォルダが存在するか確認する関数です。

存在する場合はTrue、存在しない場合はFalseを返します。

複数階層のフォルダを作成する

複数階層のフォルダをまとめて作成する場合は、makedirs()を使用します。

import os

os.makedirs("data/images")

このプログラムでは、dataフォルダの中にimagesフォルダを作成します。

すでにフォルダが存在していてもエラーにしたくない場合は、exist_ok=Trueを指定します。

import os

os.makedirs("data/images", exist_ok=True)

ファイル名を変更する

ファイル名を変更する場合は、rename()を使用します。

import os

os.rename("sample.txt", "new_sample.txt")

このプログラムを実行すると、sample.txtnew_sample.txtに変更されます。

ファイルを削除する

ファイルを削除する場合は、remove()を使用します。

import os

os.remove("sample.txt")

存在しないファイルを削除しようとするとエラーになります。

そのため、事前にファイルの存在を確認すると安全です。

import os

file_path = "sample.txt"

if os.path.exists(file_path):
    os.remove(file_path)
    print("ファイルを削除しました")
else:
    print("ファイルが見つかりません")

削除したファイルは、通常の操作のようにごみ箱へ移動するわけではありません。

重要なファイルを誤って削除しないように注意しましょう。

環境変数を取得する

osでは、パソコンに設定されている環境変数も取得できます。

import os

value = os.getenv("PATH")

print(value)

環境変数は、プログラムの設定値や秘密情報を管理するときに使用されることがあります。

例えば、APIキーをプログラムへ直接書かず、環境変数から取得する方法があります。

import os

api_key = os.getenv("API_KEY")

print(api_key)

指定した環境変数が存在しない場合は、Noneが返されます。


pathlibでパスを扱う

pathlibは、ファイルやフォルダのパスを扱うための標準ライブラリです。

osでもパスを操作できますが、最近のPythonプログラムでは、より直感的に記述できるpathlibがよく使用されます。

pathlibを使用するときは、Pathクラスをインポートします。

from pathlib import Path

現在のフォルダを取得する

現在のフォルダを取得する場合は、Path.cwd()を使用します。

from pathlib import Path

current_directory = Path.cwd()

print(current_directory)

os.getcwd()と同じように、現在の作業フォルダを確認できます。

パスを作成する

Pathを使用すると、ファイルやフォルダの場所をオブジェクトとして扱えます。

from pathlib import Path

file_path = Path("data") / "sample.txt"

print(file_path)

実行結果は次のようになります。

data\sample.txt

環境によっては、次のように表示されます。

data/sample.txt

WindowsとLinuxでは、パスの区切り文字が異なります。

しかし、Pathを使用すれば、OSに応じた形式で自動的にパスを扱ってくれます。

ファイルやフォルダの存在を確認する

指定したパスが存在するか確認する場合は、exists()を使用します。

from pathlib import Path

file_path = Path("sample.txt")

if file_path.exists():
    print("ファイルが存在します")
else:
    print("ファイルが存在しません")

ファイルかどうかを確認する場合は、is_file()を使用します。

from pathlib import Path

path = Path("sample.txt")

print(path.is_file())

フォルダかどうかを確認する場合は、is_dir()を使用します。

from pathlib import Path

path = Path("data")

print(path.is_dir())

フォルダを作成する

pathlibでフォルダを作成する場合は、mkdir()を使用します。

from pathlib import Path

folder = Path("data")

folder.mkdir()

複数階層のフォルダを作成し、すでに存在している場合もエラーにしないようにするには、次のように記述します。

from pathlib import Path

folder = Path("data") / "images"

folder.mkdir(parents=True, exist_ok=True)

parents=Trueを指定すると、親フォルダが存在しない場合も自動的に作成されます。

exist_ok=Trueを指定すると、フォルダがすでに存在していてもエラーになりません。

テキストファイルを読み込む

Pathには、テキストファイルを読み込むread_text()が用意されています。

from pathlib import Path

file_path = Path("sample.txt")

text = file_path.read_text(encoding="utf-8")

print(text)

前回までに学習したopen()を使用すると、次のように記述します。

with open("sample.txt", "r", encoding="utf-8") as file:
    text = file.read()

pathlibを使用すると、1行で読み込み処理を記述できます。

ただし、大きなファイルを少しずつ読み込みたい場合などは、open()を使用する方法も必要です。

テキストファイルへ書き込む

テキストファイルへ書き込む場合は、write_text()を使用します。

from pathlib import Path

file_path = Path("sample.txt")

file_path.write_text(
    "Pythonの標準ライブラリを学習しています。",
    encoding="utf-8"
)

ファイルが存在しない場合は、新しく作成されます。

すでにファイルが存在する場合は、内容が上書きされるため注意してください。

特定のファイルを検索する

特定の拡張子を持つファイルを検索する場合は、glob()を使用できます。

from pathlib import Path

folder = Path("data")

for file_path in folder.glob("*.txt"):
    print(file_path)

このプログラムでは、dataフォルダ内にある.txtファイルを表示します。

サブフォルダも含めて検索する場合は、rglob()を使用します。

from pathlib import Path

folder = Path("data")

for file_path in folder.rglob("*.txt"):
    print(file_path)

rglob()を使用すると、指定したフォルダ内を再帰的に検索できます。


shutilでファイルやフォルダを操作する

shutilは、ファイルやフォルダのコピー、移動、削除などを行うための標準ライブラリです。

ospathlibよりも、複数のファイルやフォルダをまとめて操作する処理に向いています。

import shutil

ファイルをコピーする

ファイルをコピーする場合は、copy()を使用します。

import shutil

shutil.copy("sample.txt", "backup.txt")

このプログラムを実行すると、sample.txtのコピーとしてbackup.txtが作成されます。

コピー先にフォルダを指定することもできます。

import shutil

shutil.copy("sample.txt", "backup")

この場合、backupフォルダ内にsample.txtがコピーされます。

ただし、コピー先のフォルダはあらかじめ作成しておく必要があります。

更新日時なども含めてコピーする

ファイルの更新日時などの情報もできるだけ維持してコピーしたい場合は、copy2()を使用します。

import shutil

shutil.copy2("sample.txt", "backup.txt")

単純にファイルの内容をコピーする場合はcopy()、ファイルの情報も含めてコピーしたい場合はcopy2()を使用します。

フォルダ全体をコピーする

フォルダの中身をまとめてコピーする場合は、copytree()を使用します。

import shutil

shutil.copytree("data", "data_backup")

このプログラムを実行すると、dataフォルダの内容がdata_backupフォルダへコピーされます。

コピー先のフォルダがすでに存在する場合もコピーできるようにするには、dirs_exist_ok=Trueを指定します。

import shutil

shutil.copytree(
    "data",
    "data_backup",
    dirs_exist_ok=True
)

ファイルやフォルダを移動する

ファイルやフォルダを移動する場合は、move()を使用します。

import shutil

shutil.move("sample.txt", "backup/sample.txt")

このプログラムを実行すると、sample.txtbackupフォルダへ移動します。

ファイル名を変更する用途にも使用できます。

import shutil

shutil.move("sample.txt", "new_sample.txt")

フォルダを中身ごと削除する

フォルダと、その中にあるファイルをまとめて削除する場合は、rmtree()を使用します。

import shutil

shutil.rmtree("data_backup")

rmtree()を実行すると、指定したフォルダとその中身がすべて削除されます。

削除したデータは簡単には元に戻せません。

実際のプログラムで使用するときは、削除対象のパスが正しいか十分に確認してください。

import shutil
from pathlib import Path

folder = Path("data_backup")

if folder.exists() and folder.is_dir():
    shutil.rmtree(folder)
    print("フォルダを削除しました")
else:
    print("削除するフォルダが見つかりません")

空き容量を確認する

shutil.disk_usage()を使用すると、ディスクの容量を確認できます。

import shutil

usage = shutil.disk_usage(".")

print(f"全体容量:{usage.total}")
print(f"使用容量:{usage.used}")
print(f"空き容量:{usage.free}")

結果はバイト単位で表示されます。

GB単位に変換する場合は、次のように計算できます。

import shutil

usage = shutil.disk_usage(".")

gb = 1024 ** 3

print(f"全体容量:{usage.total / gb:.2f} GB")
print(f"使用容量:{usage.used / gb:.2f} GB")
print(f"空き容量:{usage.free / gb:.2f} GB")

osとpathlibの違い

ospathlibには、ファイルやフォルダを操作する似た機能があります。

初心者のうちは、どちらを使用すればよいか迷うことがあるかもしれません。

例えば、ファイルの存在確認は、osでは次のように記述します。

import os

if os.path.exists("sample.txt"):
    print("ファイルが存在します")

pathlibでは、次のように記述します。

from pathlib import Path

file_path = Path("sample.txt")

if file_path.exists():
    print("ファイルが存在します")

どちらも間違いではありません。

ただし、新しくプログラムを作る場合は、ファイルパスを直感的に扱えるpathlibが便利です。

一方で、osには環境変数の取得やOSに関係する機能が多く用意されています。

用途に応じて、次のように使い分けるとよいでしょう。

ライブラリ主な用途
os環境変数、現在のフォルダ、OSに関する処理
pathlibファイルやフォルダのパス操作
shutilファイルやフォルダのコピー、移動、削除

実際のプログラムでは、これらを組み合わせて使用することもよくあります。


複数の標準ライブラリを組み合わせる

ここまで学習したライブラリを組み合わせて、テキストファイルをバックアップするプログラムを作成してみましょう。

次のプログラムでは、dataフォルダ内にある.txtファイルを、backupフォルダへコピーします。

from pathlib import Path
import shutil

source_folder = Path("data")
backup_folder = Path("backup")

backup_folder.mkdir(parents=True, exist_ok=True)

for file_path in source_folder.glob("*.txt"):
    copy_path = backup_folder / file_path.name

    shutil.copy2(file_path, copy_path)

    print(f"{file_path.name}をコピーしました")

このプログラムの処理は、次のような流れになっています。

  1. Pathでコピー元とコピー先のフォルダを指定する
  2. mkdir()でバックアップフォルダを作成する
  3. glob("*.txt")でテキストファイルを検索する
  4. shutil.copy2()でファイルをコピーする

file_path.nameを使用すると、パスからファイル名だけを取得できます。

例えば、次のパスがあるとします。

data/sample.txt

file_path.nameの結果は次のようになります。

sample.txt

標準ライブラリを組み合わせることで、実用的なファイル操作プログラムを比較的短く作成できます。


ランダムな名前でファイルを作成する

次は、randompathlibを組み合わせた例です。

ランダムな番号を含むファイルを作成してみましょう。

from pathlib import Path
import random

number = random.randint(1000, 9999)

file_name = f"sample_{number}.txt"
file_path = Path(file_name)

file_path.write_text(
    "ランダムなファイル名で作成しました。",
    encoding="utf-8"
)

print(f"{file_name}を作成しました")

実行結果の例です。

sample_5832.txtを作成しました

実行するたびに番号が変わるため、異なる名前のファイルを作成できます。

ただし、ランダムな番号が偶然重複する可能性はあります。

ファイル名を確実に一意にしたい場合は、日付や時刻、UUIDなどを利用する方法があります。


標準ライブラリを使用するメリット

標準ライブラリを使用するメリットは、単にプログラムを短くできることだけではありません。

標準ライブラリの機能は、多くのPython利用者によって使用されており、一般的な処理を安全かつ効率的に実行できるよう作られています。

例えば、ファイルをコピーする処理を自分で作る場合は、次のような処理が必要になります。

  • コピー元のファイルを開く
  • ファイルの内容を読み込む
  • コピー先のファイルを作る
  • 読み込んだ内容を書き込む
  • ファイルを閉じる
  • エラーを処理する

しかし、shutil.copy()を使用すれば、基本的なコピー処理を1行で記述できます。

shutil.copy("sample.txt", "backup.txt")

すでに用意されている機能を正しく利用することは、プログラミングにおいて非常に重要です。

すべての処理を自分で作るのではなく、必要なライブラリを調べて活用する習慣を身につけましょう。


練習問題

今回学習した内容を使用して、次のプログラムを作成してみましょう。

練習問題1

mathを使用して、半径が10の円の面積を計算してください。

円の面積は、次の式で求められます。

円周率 × 半径 × 半径

練習問題2

1から100までのランダムな整数を1つ表示してください。

練習問題3

次のリストから、ランダムに1人を選んで表示してください。

members = ["田中", "佐藤", "鈴木", "高橋", "伊藤"]

練習問題4

outputという名前のフォルダを作成してください。

すでにフォルダが存在する場合も、エラーにならないようにしてください。

練習問題5

dataフォルダ内にあるすべての.txtファイルを表示してください。

練習問題6

sample.txtbackupフォルダへコピーしてください。

コピー先のbackupフォルダが存在しない場合は、自動的に作成してください。


練習問題の解答例

練習問題1の解答例

import math

radius = 10
area = math.pi * radius ** 2

print(f"円の面積は{area:.2f}です")

練習問題2の解答例

import random

number = random.randint(1, 100)

print(number)

練習問題3の解答例

import random

members = ["田中", "佐藤", "鈴木", "高橋", "伊藤"]

selected_member = random.choice(members)

print(selected_member)

練習問題4の解答例

from pathlib import Path

folder = Path("output")

folder.mkdir(exist_ok=True)

練習問題5の解答例

from pathlib import Path

folder = Path("data")

for file_path in folder.glob("*.txt"):
    print(file_path)

練習問題6の解答例

from pathlib import Path
import shutil

source_file = Path("sample.txt")
backup_folder = Path("backup")

backup_folder.mkdir(parents=True, exist_ok=True)

copy_path = backup_folder / source_file.name

shutil.copy2(source_file, copy_path)

print("ファイルをコピーしました")

まとめ

今回は、Pythonに最初から用意されている標準ライブラリについて学習しました。

今回紹介したライブラリは、次の5つです。

ライブラリ主な用途
math平方根、円周率、切り上げ、切り捨てなどの数学計算
randomランダムな数値や要素の選択
osOS、環境変数、ファイルやフォルダの操作
pathlibファイルやフォルダのパス操作
shutilファイルやフォルダのコピー、移動、削除

標準ライブラリは、追加インストールをしなくても使用できます。

import math
import random
import os
import shutil

from pathlib import Path

Pythonには、今回紹介したもの以外にも多くの標準ライブラリがあります。

プログラムを作っているときに、「この処理を簡単に行う機能はないだろうか」と調べてみると、標準ライブラリの中に目的に合った機能が見つかることがあります。

すべての関数やライブラリを暗記する必要はありません。

どのような機能があるのかを大まかに覚えておき、必要になったときに調べながら使用することが大切です。

標準ライブラリを活用して、より短く、分かりやすく、実用的なPythonプログラムを作成していきましょう。

コメント

タイトルとURLをコピーしました