10. 標準ライブラリミニツアー


10.1 オペレーティングシステムへのインタフェース

os モジュールは、 オペレーティングシステムと対話するための何ダースもの関数を 提供しています:

 
>>> import os 
>>> os.system('time 0:02') 
0 
>>> os.getcwd()      # 現在の作業ディレクトリを返す
'C:\\Python24' 
>>> os.chdir('/server/accesslogs')

"from os import *" ではなく、 "import os" 形式を使う ようにしてください。そうすることで、 動作が大きく異なる組み込み関数 open()os.open() で隠蔽されるのを避けられます。

組み込み関数 dir() および help() は、 os のような大規模なモジュールで作業をするときに、対話的な 操作上の助けになります:

 
>>> import os 
>>> dir(os) 
<returns a list of all module functions> 
>>> help(os) 
<returns an extensive manual page created from the module's docstrings>

ファイルやディレクトリの日常的な管理作業のために、 より簡単に使える高レベルインタフェースが shutil モジュールで提供されています:

 
>>> import shutil 
>>> shutil.copyfile('data.db', 'archive.db') 
>>> shutil.move('/build/executables', 'installdir')


10.2 ファイルのワイルドカード表記

glob モジュールでは、 ディレクトリのワイルドカード検索からファイルのリストを生成する ための関数を提供しています:

 
>>> import glob 
>>> glob.glob('*.py') 
['primes.py', 'random.py', 'quote.py']


10.3 コマンドライン引数

広く使われているユーティリティスクリプトでは、しばしばコマンドライン 引数の処理を呼び出します。これらの引数は sys モジュールの argv 属性にリストとして記憶されます。例えば、以下の出力は、 "python demo.py one two three" をコマンドライン上で起動した際に 得られるものです:

 
>>> import sys 
>>> print sys.argv 
['demo.py', 'one', 'two', 'three']

getopt モジュールは、sys.argvUnixgetopt() 関数の 慣習に従って処理します。より強力で柔軟性のあるコマンドライン処理機能は、 optparse モジュールで 提供されています。


10.4 エラー出力のリダイレクトとプログラムの終了

sys モジュールには、 stdinstdout、および stderr を表す属性値も 存在します。後者の stderr は、警告やエラーメッセージを出力して、 stdout がリダイレクトされた場合でもそれらが読めるようにする 上で便利です:

 
>>> sys.stderr.write('Warning, log file not found starting a new one') 
Warning, log file not found starting a new one

"sys.exit()" は、スクリプトを終了させるもっとも直接的な方法です。


10.5 文字列のパターンマッチング

re モジュールでは、より高度な文字列処理のための正規表現 (regular expression) を提供しています。正規表現は複雑な一致検索や操作に対して簡潔で最適化 された解決策を与えます:

 
>>> import re 
>>> re.findall(r'\bf[a-z]*', 'which foot or hand fell fastest') 
['foot', 'fell', 'fastest'] 
>>> re.sub(r'(\b[a-z]+) \1', r'\1', 'cat in the the hat') 
'cat in the hat'

最小限の機能だけが必要なら、読みやすくデバッグしやすい文字列メソッドの 方がお勧めです:

 
>>> 'tea for too'.replace('too', 'two') 
'tea for two'


10.6 数学

math モジュールでは、 根底にある浮動小数点演算のための C 言語ライブラリ関数にアクセス する手段を提供しています:

 
>>> import math 
>>> math.cos(math.pi / 4.0) 
0.70710678118654757 
>>> math.log(1024, 2) 
10.0

random モジュールでは、乱数に基づいた要素選択のためのツールを提供しています:

 
>>> import random 
>>> random.choice(['apple', 'pear', 'banana']) 
'apple' 
>>> random.sample(xrange(100), 10)   # 要素を戻さないサンプリング
[30, 83, 16, 4, 8, 81, 41, 50, 18, 33] 
>>> random.random()    # ランダムな浮動小数点数
0.17970987693706186 
>>> random.randrange(6)    # range(6) からランダムに選ばれた整数
4


10.7 インターネットへのアクセス

インターネットにアクセスしたり、インターネットプロトコルを処理したり するための数多くのモジュールがあります。その中でも最も単純な二つ のモジュールは、URL を指定してデータを取得するための urllib2 と、メイルを送信するための smtplib です:

 
>>> import urllib2 
>>> for line in urllib2.urlopen('http://tycho.usno.navy.mil/cgi-bin/timer.pl'): 
...     if 'EST' in line:      # look for Eastern Standard Time 
...         print line 
 
<BR>Nov. 25, 09:43:32 PM EST 
 
>>> import smtplib 
>>> server = smtplib.SMTP('localhost') 
>>> server.sendmail('soothsayer@example.org', 'jceasar@example.org', 
"""To: jceasar@example.org 
From: soothsayer@example.org 

Beware the Ides of March. 
""") 
>>> server.quit()


10.8 日付と時刻

datetime モジュールは、 日付や時刻を操作するためのクラスを、単純な方法と複雑な方法の両方で 供給しています。日付や時刻に対する算術がサポートされている一方、 実装では出力の書式化や操作のための効率的なデータメンバ抽出に 重点を置いています。 このモジュールでは、タイムゾーンに対応したオブジェクトもサポート しています。

 
# dates are easily constructed and formatted 
>>> from datetime import date 
>>> now = date.today() 
>>> now 
datetime.date(2003, 12, 2) 
>>> now.strftime("%m-%d-%y or %d%b %Y is a %A on the %d day of %B") 
'12-02-03 or 02Dec 2003 is a Tuesday on the 02 day of December' 
 
# dates support calendar arithmetic 
>>> birthday = date(1964, 7, 31) 
>>> age = now - birthday 
>>> age.days 
14368


10.9 データ圧縮

データの書庫化や圧縮で広く使われている形式については、 zlibgzipbz2zipfile、および tarfile と いったモジュールで直接サポートしています。

 
>>> import zlib 
>>> s = 'witch which has which witches wrist watch' 
>>> len(s) 
41 
>>> t = zlib.compress(s) 
>>> len(t) 
37 
>>> zlib.decompress(t) 
'witch which has which witches wrist watch' 
>>> zlib.crc32(t) 
-1438085031


10.10 パフォーマンスの計測

Python ユーザの中には、同じ問題を異なったアプローチで解いた 際の相対的なパフォーマンスについて知りたいという深遠な興味を 抱いている人がいます。Python では、そういった疑問に即座に答える 計測ツールを提供しています。

例えば、引数の入れ替え操作に対して、伝統的なアプローチの代わりに タプルのパックやアンパックを使ってみたい気持ちになるかもしれません。 timeit モジュールを 使えば、パフォーマンス上の利点はほぼ互角だとわかります:

 
>>> from timeit import Timer 
>>> Timer('t=a; a=b; b=t', 'a=1; b=2').timeit() 
0.57535828626024577
>>> Timer('a,b = b,a', 'a=1; b=2').timeit()
0.54962537085770791

timeit では高い粒度レベルを提供しているのに対し、 profilepstats モジュールではより大きなコードブロックにおいて律速となる部分を 判定するためのツールを提供しています。


10.11 品質管理

高い品質のソフトウェアを開発するための一つのアプローチは、全ての関数 に対して開発と同時にテストを書き、開発の過程で頻繁にテストを走らせる というものです。

doctest モジュールでは、 モジュールを検索して、プログラムの docstring に埋め込まれたテストの 評価を行うためのツールを提供しています。テストの作り方は単純で、 典型的な呼び出し例とその結果を docstring にカット& ペーストすると いうものです。この作業は、ユーザに使用例を与えるという意味で ドキュメントの情報を増やすと同時に、ドキュメントに書かれている内容が 正しいかどうか doctest モジュールが確認できるようにしています:

 
def average(values): 
    """Computes the arithmetic mean of a list of numbers. 
 
    >>> print average([20, 30, 70]) 
    40.0 
    """ 
    return sum(values, 0.0) / len(values) 
 
import doctest 
doctest.testmod()   # automatically validate the embedded tests

unittest モジュールは doctest モジュールほど気楽に使えるものではありませんが、 より網羅的なテストセットを別のファイルで管理することができます:

 
import unittest 
 
class TestStatisticalFunctions(unittest.TestCase): 
 
    def test_average(self): 
        self.assertEqual(average([20, 30, 70]), 40.0) 
        self.assertEqual(round(average([1, 5, 7]), 1), 4.3) 
        self.assertRaises(ZeroDivisionError, average, []) 
        self.assertRaises(TypeError, average, 20, 30, 70) 
 
unittest.main() # Calling from the command line invokes all tests


10.12 バッテリー同梱

Python には ``バッテリー同梱 (batteries included)'' 哲学が あります。この哲学は、洗練され、安定した機能を持つ Python の膨大な パッケージ群に如実に表れています。例えば:

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。