前回は下記リンクからご覧ください。
Pythonのよく使う標準ライブラリ一覧と使い方の例 その1
statisticsで統計的な計算をする
Pythonのstatistics
モジュールは、数値データの数学的統計量を計算するための関数を提供します。これらの関数は単純な記述統計の検索から複雑な演算まで、様々なタスクに役立ちます。
statisticsライブラリの基本的な関数を使う
statistics
モジュールが提供する基本的な統計関数のいくつかを紹介します。
data = [ 1 , 3 , 4 , 5 , 7 , 9 , 2 ]
# 平均の算出
mean = statistics . mean ( data )
print ( f'平均: { mean } ' ) # 出力: 平均: 4.428571428571429
# 中央値の算出
median = statistics . median ( data )
print ( f'中央値: { median } ' ) # 出力: 中央値: 4
# 最頻値の算出
mode = statistics . mode ( data )
print ( f'最頻値: { mode } ' ) # 出力: 最頻値: 1
これらはほんの一部の機能であり、statistics
モジュールには分散や標準偏差などの統計演算を行うためのより多くの関数が用意されている。
statistics
ライブラリの高度な関数を調べる
より高度な統計解析のために、statistics
モジュールはvariance()
やstdev()
などの関数を提供しています。ここではそれらの使い方を紹介します。
# 分散の算出
variance = statistics . variance ( data )
print ( f'分散: { variance } ' ) # 出力: 分散: 9.238095238095237
# 標準偏差の算出
stdev = statistics . stdev ( data )
print ( f'標準偏差: { stdev } ' ) # 出力: 標準偏差: 3.0394235042348474
Pythonのitertools
モジュールは、(リストや辞書などの)反復子を扱う際に高速で効率的にメモリを使用することを目的としたツールのコレクションです。itertools
を使用すると効率的な方法でデータを操作でき、大規模なデータセットを含む問題で非常に便利です。
itertools
でよく使われる関数はイテラブル(リストや文字列など)を無限に反復するcycle()
と、数値(デフォルト0)からスタートして無限にインクリメントするcount()
です。
# itertools.cycle()を使用
cycler = itertools . cycle ( 'ABCD' )
for i in range ( 10 ) :
print ( next ( cycler ) ) # 出力: A B C D A B C D A B
# itertools.count()を使用
counter = itertools . count ( start = 5 , step = 5 )
for i in range ( 10 ) :
print ( next ( counter ) ) # 出力: 5 10 15 20 25 30 35 40 45 50
itertools.cycle()
とitertools.count()
は無限のイテレータを返すため、止めないと永遠に実行されてしまうので注意してください。
itertools
にはpermutations()
やcombination()
など、いくつかの組合せ関数も含まれています。
# 順列の作成
perms = itertools . permutations ( 'ABC' , 2 )
for perm in perms :
print ( perm ) # 出力: ('A', 'B') ('A', 'C') ('B', 'A') ('B', 'C') ('C', 'A') ('C', 'B')
# 組み合わせの作成
combs = itertools . combinations ( 'ABC' , 2 )
for comb in combs :
print ( comb ) # 出力: ('A', 'B') ('A', 'C') ('B', 'C')
Pythonのfunctools
ライブラリは、高次関数、すなわち他の関数に作用したり、他の関数を返したりする関数を作成するために設計された高度なツールです。この名前はfunction
とtools
を組み合わせたもので、このライブラリが関数を扱うための一連のツールを提供することを意味しています。特に、他の関数をパラメータとして取り込んだり、他の関数を返したりする関数のような高次の関数を扱うときに便利です。
functools
の一般的な使い方のひとつに他の関数の動作を変更する特殊な関数であるデコレーターの作成があります。ここではある関数の実行時間を記録するデコレーターの例を示します。
import time
def timer_decorator ( func ) :
@functools . wraps ( func )
def wrapper ( * args , ** kwargs ) :
start_time = time . time ( )
result = func ( * args , ** kwargs )
end_time = time . time ( )
print ( f"Executed { func . __name__ } in { end_time - start_time } seconds" )
return result
return wrapper
@timer_decorator
def add ( a , b ) :
time . sleep ( 2 ) # 長めの実行処理
return a + b
print ( add ( 3 , 5 ) ) # 出力: Executed add in 2.002013921737671 seconds
この例では、@timer_decorator
がadd
関数のソースコードを変更することなく修正を適用しています。
functools
にはlru_cache
(Least Recently Used Cache)というデコレーターも用意されており、計算量が多く、同じ引数で何度も呼び出される関数の場合は高速化できます。以下は簡単な例です。
@functools . lru_cache
def fib ( n ) :
if n < 2 :
return n
return fib ( n - 1 ) + fib ( n - 2 )
print ( fib ( 10 ) ) # 出力: 55
この例では、lru_cache
がfib
関数の結果を記憶しているので同じ引数でfibを再度呼び出すと、記憶した結果を返すだけでn番目のフィボナッチ数の計算にかかる時間が大幅に短縮されます。
operatorで演算子の可読性を上げる
Pythonではoperator
モジュールは関数型プログラミングツールとして機能します。基本的には算術演算子や比較演算子のように、一般的に関数的または記号的な方法で使用される演算子の機能を提供するものです。これによってコードがより読みやすくなり、多くの場合、より効率的になります。
Pythonにおけるoperatorの威力
operator
の一般的な使い方の1つに、関数のパラメータとして演算子を使用するためのより読みやすく効率的な方法を提供することがあります。これはmap()
やfilter()
のような関数との組み合わせで特に有用です。以下はその例です。
nums = [ 1 , 2 , 3 , 4 , 5 ]
squares = list ( map ( operator . mul , nums , nums ) )
print ( squares ) # 出力: [1, 4, 9, 16, 25]
この例では掛け算を行うoperator.mul
関数とmap()
関数を使ってリスト内の各数値を二乗しています。
リストのソートにおけるoperatorライブラリ
operator
ライブラリは辞書のリストをソートする際にも非常に便利です。例えば、各辞書が人を表す辞書のリストがあり、その人の年齢でリストをソートしたい場合、operator
ライブラリのitemgetter
関数を使うことができます。
people = [ { 'name' : 'Taro' , 'age' : 20 } , { 'name' : 'Hanako' , 'age' : 18 } , { 'name' : 'Bob' , 'age' : 21 } ]
people . sort ( key = operator . itemgetter ( 'age' ) )
print ( people ) # 出力: [{'name': 'Hanako', 'age': 18}, {'name': 'Taro', 'age': 20}, {'name': 'Bob', 'age': 21}]
pathlibでファイルパスを便利に扱う
Pythonにおいて、pathlib
はファイルシステムのパスを扱うために使用される組み込みライブラリです。os.path
などの他の組み込み手法と比較して、より直感的にファイルパスを扱えるように設計されています。
pathlibによるファイルシステムのナビゲート
pathlib
モジュールを使えばオペレーティングシステムによって異なるスラッシュやバックスラッシュの正しい使い方を気にすることなく、簡単にパスを構築できます。以下は、パスを作成する例です。
パスの結合は、/
演算子を使って簡単にできます。
new_p = p / 'dir3' / 'file.txt'
print ( new_p ) # 出力: dir1/dir2/dir3/file.txt
ファイルの属性にアクセスし、パスを操作する
pathlib
モジュールにはファイルの属性にアクセスしたり、パスを操作したりするためのメソッドも多数用意されています。以下はその例です。
p = Path ( 'dir1/dir2/file.txt' )
# 親ディレクトリを取得
print ( p . parent ) # 出力: dir1/dir2
# ファイル名を取得
print ( p . name ) # 出力: file.txt
# 拡張子を取得
print ( p . suffix ) # 出力: .txt
# 拡張子を変更
new_p = p . with_suffix ( '.jpg' )
print ( new_p ) # 出力: dir1/dir2/file.jpg
このようにpathlib
はPythonでファイルパスを扱うためのシンプルで直感的な方法を提供しており、ファイル操作する必要がある場合には強く推奨します。
globでファイルの一括操作を簡単に扱う
Pythonのglob
モジュールは、プログラマーが指定されたパターンに一致するディレクトリ階層下のファイルのリストを作成するために使用する強力なツールです。glob
という用語はUnixのシェル言語に由来しており、ワイルドカード文字を使ってファイル名を照合するために使用されます。
globでファイルを検索する
glob
モジュールには、パターンを受け取り、そのパターンにマッチするファイルのリストを返すglob
と呼ばれる関数があります。例えば、カレントディレクトリにあるすべての.txt
ファイルを探したい場合、次のようにします。
txt_files = glob . glob ( '*.txt' )
また、サブディレクトリ内のファイルを検索できます。例えばカレントディレクトリの任意のサブディレクトリにあるすべての.jpg
ファイルを見つけたい場合は、次のようにします。
jpg_files = glob . glob ( '**/*.jpg' , recursive = True )
ワイルドカードと文字クラスの使用
glob
はUnixシェルで使用される通常のワイルドカード文字、*
(全てにマッチ)、?
(任意の1文字にマッチ)、[]
(括弧内の任意の文字にマッチ)をサポートします。以下はその例です。
# '.py'で終わるすべてのファイル
py_files = glob . glob ( '*.py' )
# 'file1', 'file2', ..., 'file9'がつくすべてのファイル
files = glob . glob ( 'file[1-9]' )
# 'file1'と'file2'がつくファイル
files = glob . glob ( 'file[1-2]' )
sqlite3でSQLiteデータベースを操作する
SQLiteは自己完結型、ファイルベース、そして完全な機能を持つSQLエンジンです。Pythonの標準ライブラリにはSQLiteデータベースと対話するために設計されたsqlite3
と呼ばれるモジュールが含まれています。他の多くのSQLデータベースとは異なり、別のサーバープロセスを必要とせず、SQLクエリ言語の非標準的な変種を使用してデータベースにアクセスできます。
SQLite データベースの作成と接続
SQLiteデータベースと対話するためには、まずそのデータベースへの接続を作成する必要があります。これは、Connection
オブジェクトを返すconnect()
関数で行うことができます。新しいデータベースを作成したり、既存のデータベースに接続したりできます。以下はその例です。
conn = sqlite3 . connect ( 'example.db' )
データベースに変更を加えた後、接続を閉じることを忘れないでください。
SQLite3によるSQLコマンドの実行
Connection
オブジェクトを使えば、PythonでSQLコマンドを実行できるようになりました。接続オブジェクトのexecute()
メソッドでは、任意のSQLコマンドを実行できます。ここでは、テーブルを作成する例を示します。
cursor = conn . cursor ( )
cursor . execute ( """
CREATE TABLE employees (
employee_id INTEGER PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL,
hire_date DATE NOT NULL
)
""" )
変更した内容をデータベースに保存するには、接続オブジェクトのcommit()
メソッドを呼び出す必要があります。
zlibで圧縮アルゴリズムを扱う
Pythonのzlib
ライブラリは、コンピュータの世界で広く使われている圧縮アルゴリズムであるDEFLATEアルゴリズムを使ってデータを圧縮・解凍するための関数を提供しています。このモジュールでは、gzipフォーマットやCRC-32チェックサム計算などを用いてデータブロックを管理できます。zlibモジュールは、大きなデータやファイルを扱うときに優れたツールです。
zlibによるデータの圧縮と解凍
zlib
の主要な関数はcompress()
とdecompress()
です。compress()
関数はバイト列を受け取り、データを圧縮したバイト列を返します。逆にdecompress()
はデータを解凍します。以下はその例です。
# オリジナルデータ
data = b"This is some data that we want to compress"
# データの圧縮
compressed_data = zlib . compress ( data )
print ( f'圧縮データ: { compressed_data } ' )
# データの解凍
decompressed_data = zlib . decompress ( compressed_data )
print ( f'解凍されたデータ: { decompressed_data } ' )
zlib によるデータの完全性チェック
zlib
のもう1つの便利な機能はデータの CRC-32 (Cyclic Redundancy Check) チェックサムを計算し、データの完全性をチェックするのに役立ちます。以下はその例です。
# CRC-32チェックサムの計算
checksum = zlib . crc32 ( data )
print ( f'CRC-32 checksum: { checksum } ' )
gzipでファイルの圧縮と解凍を行う
Pythonのgzip
モジュールは標準ライブラリの一部で、GNU zip形式を使ったファイルの圧縮と解凍に使用されます。このフォーマットはUnixやLinuxシステムでファイル圧縮のために最も一般的に使用されています。gzip
モジュールは、gzipファイルを作成する機能と、これらのファイルに対して直接読み書きする機能を提供します。
gzipファイルの作成と書き出し
Pythonでgzipファイルを作成するには、gzip.open()
メソッドでファイルを開き他のファイルと同じように書き込むだけでよいです。以下はその例です。
import gzip
data = b"This is some data that we want to compress"
with gzip . open ( 'file.txt.gz' , 'wb' ) as f :
f . write ( data )
このスクリプトは、file.txt.gz
という新しいgzipファイルを作成し、そこにバイト列data
を書き込むものです。
gzipファイルからの読み込み
gzipファイルからの読み込みは、書き込みとほぼ同じ方法で行われます。gzip.open()
メソッドでファイルを開き.read()
を呼び出して内容を読み込みます。以下はその例です。
import gzip
with gzip . open ( 'file.txt.gz' , 'rb' ) as f :
file_content = f . read ( )
print ( file_content )
zipfileでzipファイルを操作する
Pythonのzipfile
モジュールは標準ライブラリの一部です。ZIPファイルの作成、読み込み、書き込み、追記、一覧表示などの機能を提供します。ZIPは可逆的なデータ圧縮をサポートする一般的なアーカイブファイル形式です。ZIPファイルは1つまたは複数のファイルやディレクトリを含むことができます。
ZIPファイルの作成と書き出し
zipfile
モジュールを使うと新しいZIPファイルを作成したり、既存のZIPファイルに追記したりできます。ZIPファイルにファイルを書き込むには、ZipFile
クラスを使用し、第2引数に書き込みモードを示すw
を指定します。以下はその例です。
import zipfile
# 新しいZIPファイル作成
with zipfile . ZipFile ( 'newfile.zip' , 'w' ) as myzip :
# ZIPファイルに書き込み
myzip . write ( 'test.txt' )
この例では、newfile.zip
という名前の新しいZIPファイルを作成し、test.txt
という名前のファイルをその中に追加しています。write
メソッドにはZIPファイルに追加するファイル名を指定します。
ZIPファイルから読み込む
ZIPファイルの中身を読むにはZipFile
クラスで読み出し用のファイルを開くだけです。
import zipfile
# 既存のZIPファイルを読み込み
with zipfile . ZipFile ( 'newfile.zip' , 'r' ) as myzip :
# すべてのファイルを抽出
myzip . extractall ( )
この例では、先に作成したnewfile.zip
ファイルを開き、すべてのファイルをカレントディレクトリに展開します。extractall
メソッドは、アーカイブのすべてのメンバーを現在の作業ディレクトリに展開します。
tarfileでtarアーカイブを操作する
Pythonのtarfile
モジュールは、tarアーカイブの読み書きするためのものです。tarアーカイブは、複数のファイルをまとめて1つのパッケージにする一般的な方法です。Unixベースのシステムでよく使用されます。tarfile
モジュールはtarアーカイブの作成、tarアーカイブの読み込み、これらのアーカイブからファイルを抽出する機能を提供します。
tarファイルの作成と書き出し
tarfile
モジュールを使えば新しいtarアーカイブの作成は簡単です。
import tarfile
# 新しいtarファイルの作成
with tarfile . open ( 'my_archive.tar' , 'w' ) as tar :
# tarファイルにファイルを追加
tar . add ( 'test.txt' )
この例ではmy_archive.tar
という名前の新しいtarファイルを作成し、test.txt
という名前のファイルをその中に追加しています。tarアーカイブにファイルを追加するには、add
メソッドを使用します。
tarファイルから読み込む
tarファイルの中身を読み取るのも簡単です。tarアーカイブの中身を一覧表示したりファイルを抽出したりできます。
import tarfile
# 既存のtarファイルを読み込み
with tarfile . open ( 'my_archive.tar' , 'r' ) as tar :
# 中身のファイルを抽出
tar . extractall ( )
この例では先に作成したmy_archive.tar
ファイルを開き、すべてのファイルをカレントディレクトリに展開します。extractall
メソッドは、アーカイブの全メンバーを現在の作業ディレクトリに抽出します。
csvでCSVファイルの読み書きを操作する
CSVはComma Separated Valuesの略で、表計算ソフトやデータベースのように表形式で情報が保存される最も一般的なデータ形式の1つです。Pythonのcsv
モジュールを使うと、CSVファイルを簡単に解析し操作できます。
CSVファイルの読み込み
csv
モジュールでできる最も基本的な操作の1つはCSVファイルの読み込みです。Pythonのcsv
モジュールにはCSVファイルを読み込むためのリーダー関数が用意されています。ここでは、data.csv
という名前のCSVファイルを読んでみましょう。
import csv
# ファイルを開く
with open ( 'data.csv' , 'r' ) as file :
# CSVリーダーを作成
reader = csv . reader ( file )
# 行を展開する
for row in reader :
print ( row )
この例ではdata.csv
ファイルを開きCSVリーダーを作成しファイルの行を繰り返し処理します。各行には、その行の値のリストが表示されます。
CSVファイルの書き方
csv
モジュールではCSVファイルの書き込みも可能です。ここでは、CSVファイルにデータを書き込む方法を説明します。
import csv
# 書き込むデータ
data = [
[ 'Name' , 'Age' ] ,
[ 'Taro' , 25 ] ,
[ 'Hanako' , 30 ] ,
]
# ファイルを開く
with open ( 'data.csv' , 'w' , newline = '' ) as file :
# CSVライターを作成
writer = csv . writer ( file )
# データを書き込む
for row in data :
writer . writerow ( row )
この例では、データを表現するためにリストのリストを作成し、各リストはデータの行になります。次に、ファイルを開き(存在しない場合は作成する)、そのファイル用のCSVライターを作成し、データをファイルに書き込みます。writerow
を呼び出すたびにCSVファイルへ1行ずつ書き込みます。
configparserで設定ファイルを操作する
Pythonのconfigparser
モジュールは設定ファイルを操作するために使用します。これはWindowsのINIファイルによく似ています。キー・バリューペアに似た構造を提供します。設定ファイルは、[section]
ヘッダで始まるセクションと、特定の文字列(デフォルトでは=
または:
)を使って区切られたキー/値で構成されています。
設定ファイルへの書き込み
configparser
を使用して設定ファイルを作成してみましょう。ここでは3つのセクションを作成することにします。DEFAULT、Settings、Filesの3つのセクションを作成し、それぞれにキーと値のペアを設定します。
import configparser
config = configparser . ConfigParser ( )
config [ 'DEFAULT' ] = { 'ServerAliveInterval' : '45' ,
'Compression' : 'yes' ,
'CompressionLevel' : '9' }
config [ 'Settings' ] = { }
config [ 'Settings' ] [ 'User' ] = 'user_name'
config [ 'Settings' ] [ 'Password' ] = 'user_password'
config [ 'Files' ] = { }
config [ 'Files' ] [ 'Document' ] = 'doc_file.txt'
config [ 'Files' ] [ 'Image' ] = 'img_file.jpg'
with open ( 'example.ini' , 'w' ) as configfile :
config . write ( configfile )
このスクリプトはカレントディレクトリにexample.ini
ファイルを作成します。
設定ファイルからの読み込み
では、先ほど作成した設定ファイルを読み込む方法を紹介します。
import configparser
config = configparser . ConfigParser ( )
config . read ( 'example.ini' )
# すべてのsectionを出力
print ( config . sections ( ) )
# ファイルの値にアクセス
print ( 'Settings:' , config [ 'Settings' ] )
print ( 'User:' , config [ 'Settings' ] [ 'User' ] )
print ( 'Password:' , config [ 'Settings' ] [ 'Password' ] )
このスクリプトでは、まずconfig.read()
を使って設定ファイルを読み込んでいます。config.section()
メソッドはセクションのリストを返します。キーの値にアクセスするには、辞書のような方法でconfig
オブジェクトを使用します。
tomllibでTOMLファイルを操作する
Pythonのtomllib
ライブラリはTOMLファイルを扱うために設計されています。TOMLは設定ファイルのフォーマット言語で、明白で最小限の構文により、読み書きが容易であることを意図しています。様々なアプリケーションの設定ファイルとして一般的に使用されています。
TOMLファイルの書き方
この例ではいくつかのセクションを持つTOML設定ファイルを作成してみましょう。
import toml
# 設定データ
config = {
'database' : {
'server' : '192.168.1.1' ,
'ports' : [ 8001 , 8001 , 8002 ] ,
'connection_max' : 5000 ,
'enabled' : True
} ,
'servers' : {
'alpha' : {
'ip' : '10.0.0.1' ,
'dc' : 'eqdc10'
} ,
'beta' : {
'ip' : '10.0.0.2' ,
'dc' : 'eqdc10'
}
}
}
# 設定を書き込む
with open ( 'config.toml' , 'w' ) as f :
toml . dump ( config , f )
このスクリプトを実行すると、config辞書に記述されたデータを含むconfig.toml
ファイルがカレントディレクトリに生成されます。
TOMLファイルの読み込み
先ほど作成したTOMLファイルをtoml
モジュールで読み取ってみましょう。
import toml
# TOMLファイルの読み込み
with open ( 'config.toml' , 'r' ) as f :
config = toml . load ( f )
# ファイルの値にアクセス
print ( 'Database:' , config [ 'database' ] )
print ( 'Server:' , config [ 'database' ] [ 'server' ] )
print ( 'Ports:' , config [ 'database' ] [ 'ports' ] )
このスクリプトでは、まずtoml.load()
を使ってTOMLファイルを読み込みます。configを辞書として扱うことで、設定値にアクセスできます。
hashlibで文字列をハッシュ化する
Pythonのhashlib
ライブラリはメッセージを安全にハッシュ化するためのわかりやすいインターフェイスを提供します。ハッシュ化とは、データを一意な値に変換することで、データ検索、パスワード保存、データ完全性検証、暗号化アプリケーションなどでよく使われます。
hashlibの基本的な使い方
hashlib
の最も基本的な使い方の1つは与えられた文字列に対するハッシュを生成することです。例えば、次のようにすればメッセージのSHA256ハッシュを作成できます。
import hashlib
message = 'Hello, world!'
hashed_message = hashlib . sha256 ( message . encode ( ) ) . hexdigest ( )
print ( f'The SHA256 hash of " { message } " is: { hashed_message } ' )
このコードはメッセージ文字列を受け取り、それをバイトにエンコードし、SHA256を使ってハッシュ化し、ハッシュオブジェクトを読みやすいように16進数の文字列に変換しています。
さまざまなハッシュアルゴリズムを使う
hashlib
は、SHA1、SHA224、SHA256、SHA384、SHA512、MD5など、さまざまなハッシュアルゴリズムに対応しています。hashlibモジュール内の適切な関数を呼び出すだけで、異なるアルゴリズムを使用できます。以下は、MD5ハッシュを作成する例です。
import hashlib
message = 'Hello, world!'
hashed_message = hashlib . md5 ( message . encode ( ) ) . hexdigest ( )
print ( f'The MD5 hash of " { message } " is: { hashed_message } ' )
異なるハッシュアルゴリズムには異なる特性があり、他のものより安全なものがあることを忘れないでください。ほとんどの用途ではSHA256が良い選択です。
hmacで認証コードを生成する
Pythonのhmac
ライブラリは鍵付きハッシュメッセージ認証コード(HMAC)を生成するための強力なツールです。HMACは、暗号化ハッシュ関数を用いてメッセージと秘密鍵を結合します。この仕組みは、データの完全性や真正性を保証するためによく使われます。
hmacの基本的な使い方
HMACを作成するには、メッセージ、キー、ハッシュアルゴリズムを指定する必要があります。Pythonのhmac
ライブラリは、このプロセスを簡略化します。以下はその例です。
import hmac
import hashlib
message = b'Hello, world!'
key = b'secret_key'
hashed = hmac . new ( key , message , hashlib . sha256 )
print ( 'HMAC:' , hashed . hexdigest ( ) )
この例ではhmac
モジュールのnew
関数を使って、新しいHMACオブジェクトを作成し、キーとメッセージを渡し、ハッシュ関数としてSHA256を指定しています。メッセージとキーは文字列ではなくバイトでなければならないので、バイトリテラル(b''
)を使っています。
hmacの注意点
鍵となる符号を他者に知られている場合は任意のメッセージに対して独自のHMACを生成でき、HMACの目的が達成されません。また、HMACにはSHA256のような安全なハッシュ関数を使用するのが一般的です。
また、hmac
モジュールはcompare_digest
関数を提供し、2つのダイジェストが等しいかどうかを安全に比較するために使用できることを忘れないでください。
import hmac
import hashlib
message = b'Hello, world!'
key = b'secret_key'
hashed1 = hmac . new ( key , message , hashlib . sha256 )
hashed2 = hmac . new ( key , message , hashlib . sha256 )
print ( 'Are HMACs equal?' , hmac . compare_digest ( hashed1 . digest ( ) , hashed2 . digest ( ) ) )
この例では、compare_digest
を使用して2つのHMACオブジェクトのダイジェストを比較し、同じであればTrue、そうでなければFalseを返しています。これは、==
演算子とは異なり、タイミング攻撃に対して安全です。
secretsで秘密情報を扱う
Pythonの組み込みsecrets
モジュールは、パスワード、アカウント認証、セキュリティトークン、および関連する秘密などのデータを管理するのに適した、暗号的に強い乱数を生成する便利なライブラリです。暗号化アプリケーションでは、これらの数値は安全なランダムパスワードやトークンの作成に使用されます。
セキュアトークンを生成する
secrets
モジュールの最もよく使われる機能の1つがセキュアトークンの生成です。ここでは指定したバイト数でランダムなURLセーフのテキスト文字列を生成する方法を紹介します。
import secrets
token = secrets . token_urlsafe ( 16 )
print ( token )
上の例では、token_urlsafe()
関数が16バイトのランダムなURLセーフテキスト文字列を生成しています。
secretsの詳細
トークンを生成する以外にもsecrets
モジュールを使って安全な乱数を生成できます。これは特にランダムなパスワードを作成するのに便利です。以下はその例です。
import secrets
import string
alphabet = string . ascii_letters + string . digits
password = '' . join ( secrets . choice ( alphabet ) for i in range ( 10 ) )
print ( password )
上記の例では、パスワードの各文字の生成にsecrets.choice()
関数が使われています。これは与えられたアルファベットからランダムに文字を選択し、パスワードの希望の長さのためにこのプロセスを繰り返します。これにより、生成される各パスワードの高いランダム性が確保されます。
ioで入出力周りを便利に扱う
Pythonではio
モジュールが様々なタイプのI/O(入出力)を扱うための主要な機能を提供します。I/Oには、テキストI/O、バイナリI/O、生I/Oの3つの主要なタイプがあります。特定のユースケースに対しては動作を実装する様々な具象クラスが存在します。
StringIOによるテキスト入出力
主要なクラスの1つであるStringIOを見てみましょう。このクラスはバッファ間で文字列の読み書きします。これは一時ファイルを必要とせず、メモリ内で文字列を操作するのに便利です。以下はその例です。
import io
output = io . StringIO ( )
output . write ( 'This goes into the buffer. ' )
print ( 'And so does this.' , file = output )
# 書き込まれた値を取得する
print ( output . getvalue ( ) )
output . close ( ) # バッファメモリを破棄する
この例ではまずoutput
というStringIOオブジェクトを作成します。そして、write()
メソッドとprint()
関数を使用して、このオブジェクトに書き込みを行います。最後に、getvalue()
で全内容を取得しています。
BytesIOによるバイナリI/O
StringIOと同様に、BytesIOはバッファ(今回はstrではなくbytes)との間でバイトの読み書きするクラスです。以下はその例です。
import io
binary_output = io . BytesIO ( )
binary_output . write ( b'This goes into the buffer. ' )
binary_output . write ( b'And so does this.\n' )
# 書き込まれた値を取得する
print ( binary_output . getvalue ( ) )
binary_output . close ( ) # バッファメモリを破棄する
この例では、BytesIOオブジェクトを作成し、そこにバイトを書き込んでいます。そして、getvalue()
を使って内容を取得しています。バイトの書き込みと読み出しを行っているので、これを示すために文字列の前にb
を付けています。
timeで時間を操作する
Pythonのtime
モジュールは時間に関連する様々な関数を提供します。タイムスタンプやプログラムの遅延を扱う必要があるとき、あるいは単に現在の時刻を知りたいときに役立つツールです。
エポックからの時間
よく使われる関数にtime()
があり、エポック(epoch)からの経過秒数を浮動小数点数で返します。エポックとはUTC(協定世界時)で1970年1月1日の始まりと定義されています。タイムスタンプを比較したり、あるコードにかかった時間を計測したりするときに使うことができます。
import time
seconds_since_epoch = time . time ( )
print ( "Seconds since epoch =" , seconds_since_epoch )
このコードではエポック開始からの経過秒数が出力されます。
timeを使ってn秒間待機する
よく使う関数にsleep()
があります。この関数は指定した秒数だけプログラムを待たせるものです。プログラムに遅延や一時停止を導入するのに便利です。
import time
print ( "これはすぐに表示されます。" )
time . sleep ( 2.4 ) # 2.4秒遅延させる
print ( "これは2.4秒待機後に表示されます。" )
この例では、まずメッセージを表示し、2.4秒待って別のメッセージを表示しています。このコードを実行すると遅延があることに気がつくでしょう。
続きは下記リンクからご覧ください。
Pythonのよく使う標準ライブラリ一覧と使い方の例 その3