2013/08/26

ライブラリ:loremipsum

Pythonの「loremipsum」というライブラリについてご紹介します。

import loremipsum

loremipsumは、サンプル文字列を生成するためのライブラリです。名前から想像がつく方もあるかと思いますが、そのまま、「lorem ipsum...」的なランダムな文章を生成してくれます。

使う機会はあまり多くないかと思いますが、ランダムな文章をあてでどこかに入れたいときなんかに便利です。

以下、主な使い方を見ていきます。

サンプル文の生成

s1 = loremipsum.get_sentences(4)
for row in s1:
    print row
# たとえば次のとおり表示
# Risus fames risus lorem risus nibh nunc.
# Donec dolor diam.
# Felis porta vitae.
# Ipsum velit quisque libero fusce et.
get_sentence()関数は、引数に渡された整数値の数のサンプル文をリストにして返してくれます。

サンプルパラグラフの生成

p1 = loremipsum.get_paragraphs(3)
pprint.pprint(p1)
get_sentence()が「.」(ピリオド)までの文を一単位として返すのに対し、get_paragraphs()は、複数の文がまとまった「段落」ひとつの単位として、渡された整数値の分だけ段落を返してくれます。こちらも返ってくる形式はリストです。

もっと深く使う

from loremipsum import Generator
g = Generator()
sample = g.generate_paragraph()
print sample
単語辞書を与えたりなどして、より柔軟に使えるサンプル文章機能を提供するGeneratorクラスも存在します。generate_paragraph()で返されるのは、要素数が3つのタプルです。中身は、(文数, 単語数, 1つの段落の文字列)となっています。

Generator()クラスについては、generate_paragraph()以外にもさまざまなメソッドを備えているので、詳しくはLorem Ipsumライブラリの公式ドキュメントをごらんください。


インストール
pipをインストールしてあれば、次のコマンドでインストールできます。
pip install loremipsum

以上です。


参考
loremipsum - pypi
Lorem Ipsum - 公式ドキュメント

2013/08/19

ライブラリ:pprint

Pythonの「pprint」というライブラリについてご紹介します。

import pprint 

pprintは、「pretty-print」の略で、オブジェクトを整形し人が見て見やすい形に表示してくれるライブラリです。同名の「pprint」という関数がそのメインとなります。

シンプルな関数ですが、途中の値を確認しながらコーディングするときなんかに重宝します。

import pprint 

nums = ['one', 'two', 'three']
pprint.pprint(nums)
# 次のとおり表示
# ['one', 'two', 'three']
短いリストなんかは、そのままprintしたのと同じ形で表示されます。

sentence = """
Python is a remarkably powerful dynamic programming language
"""
words = sentence.strip().split(' ')
pprint.pprint(words)
# 次のとおり表示
# ['Python',
#  'is',
#  'a',
#  'remarkably',
#  'powerful',
#  'dynamic',
#  'programming',
#  'language']
リストが長くなってそのまま横に続けて表示すると長くなる場合なんかには、ラインを揃えて縦に表示してくれます。

vegies = {'c': ['carrot', 'cucumber'],
          'l': 'lettuce',
          'p': ['potato', 'pepper'],
          't': 'tomato'}
pprint.pprint(vegies)
# 次のとおり表示
# {'c': ['carrot', 'cucumber'],
#  'l': 'lettuce',
#  'p': ['potato', 'pepper'],
#  't': 'tomato'}
辞書型の変数や、入れ子になったオブジェクトなんかも、きれいに整形して表示してくれます。

import math
mathfuncs = [math.sin, math.cos, math.tan, math.exp]
pprint.pprint(mathfuncs)
# 次のとおり表示
# [<built-in function sin>,
#  <built-in function cos>,
#  <built-in function tan>,
#  <built-in function exp>]
クラス名の場合なんかにも、横に長くなるときには自動的に改行してきれいに表示してくれます。

以上です。


pprint - Python公式ドキュメント

ライブラリ:StringIO

Pythonの「StringIO」というライブラリについてご紹介します。

import StringIO

StringIOは、文字列にファイルオブジェクトのインタフェースを与えることができるライブラリです。StringIOを使うと、文字列をファイルオブジェクトのように扱うことができます。

例を見てみましょう。

01 文字列の追加

import StringIO

io = StringIO.StringIO()

io.write('This is the first line.\n')
io.write('This is second.\n')

io.close()
StringIOライブラリを使うには、まずはStringIOインスタンスを生成します。生成したインスタンスのwrite()メソッドに文字列を渡すと、文字列を追加することができます。

これはちょうど、次のようにFileクラスのインスタンスに対してwrite()メソッドを使うことと同じようなイメージになります。
f = open('sample.txt', 'r')

f.write('This is the first line.\n')
f.write('This is second.\n')

f.close()
close()でそのインスタンスを解放できる点もFileオブジェクトと同じです。

f.writelines(['3rd\n', '4th\n', '5th\n'])
write()では引数に文字列を受け取りましたが、writelines()の場合は文字列のリストやタプルを受け取ります。

print >> io, '6th\n'
StringIOインスタンスをprint文の出力先に設定することもできます。

02 文字列の読み出し

sentence = u"""古池や
蛙飛びこむ
水の音
"""

io2 = StringIO.StringIO(sentence)
print io2.getvalue()
io2.close()
# 次のとおり表示
# 古池や
# 蛙飛びこむ
# 水の音
文字列の読み出しには、いくつかのメソッドを使うことができます。getvalue()は、バッファ内の文字列をすべて返してくれるメソッドです。

ほかの読み出し用メソッドとしては、次のようなものがあります。
  • read()
  • readline()
  • readlines()

このあたりのメソッドはFileオブジェクトにあるものと同じ働きをします。それぞれ次のような特徴があります。
  • read() 現在のポインタ(カーソル?)の位置以降の文字列をすべて返す
  • readline() 現在のポインタの位置以降の行を1行返す
  • readlines() 現在のポインタの位置以降の文字列を行ごとに分けてリストで返す

いずれも引数として整数値を渡すとそのバイト分だけの文字列を返す仕様となっていますが、それぞれちょっとずつちがいがあります。詳細は公式ドキュメントのFileオブジェクトのパートをご確認いただくのがよいかと思います。

上で出てきたgetvalue()とこれらとのちがいは、これら3つは現在のポインタの位置によって出力が異なりますが、getvalue()はポインタの位置にかかわらずすべての文字列を返してくる点です。

以上です。


StringIOをたくさん使う場合には、StringIOと同じインタフェースを備えたより高速なcStringIOを使うのがよさそうです。


参考
StringIO - Python公式ドキュメント
Fileクラス - Python公式ドキュメント
python StringIO usage? - Stack Overflow
What is StringIO in python used for in reality? - Stack Overflow

2013/08/15

ライブラリ:virtualenv

Pythonのライブラリ「virtualenv」についてご紹介します。

「virtualenv」は独立したPython環境を手軽に構築できるようにしてくれるツールです。コマンドラインから使うタイプのものとなります。

たとえば
  • 複数のPython環境を作って、手軽に切り替えて使いたいとき
  • 一時的に利用する使い捨ての環境を作りたいとき
なんかに便利です。

具体的には、「Pythonを動かすのに必要なセットを任意のディレクトリに作る」ということをコマンドひとつでやってくれます。

一度馴染めば、使うコマンド・オプションはごくわずかだしシンプルなツールなのですが、一見、ちょっとややこしいものに見えるかもしれません。

以下、ざっとシンプルに、使い方を見ていきたいと思います。まずはインストールから。

virtualenvのインストール

pipが入っていれば、コマンドから次のように打てば入ってくれます。
pip install virtualenv

コマンドラインから次のように入力してヘルプが表示されればインストールは成功です。
virtualenv

インストールは確かにできているのにvirtualenvコマンドが使えない、といった場合にはパスが通っていない可能性が高いので、Windowsの場合はPythonディレクトリ内の「Scripts」にパスを通しましょう。

pipやeasy_installが入っていない、あるいは使えない、といった場合には、pypiのvirtualenvのページからtar.gz一式をダウンロードしてきましょう。その中にある「virtualenv.py」を取り出してこれば、これ単体で使うことが可能です(レンタルサーバなんかで使う場合はこちらになるかと思います)。

独立環境の作成

実際にvirtualenvを使ってみましょう。適当なディレクトリに行き、次のコマンドを実行します。
virtualenv myenv

すると、カレントディレクトリに「myenv」というディレクトリが作られ、その中にPython環境一式が入れられます。「myenv」の部分は任意の名前を入力します。

上述の「virtualenv.pyを単体で使う場合」では、次のようにするとよいかと思います。
python virtualenv.py myenv

独立環境の利用

つづいて、作成した独立環境を利用する方法についてです。まずは独立環境のディレクトリに移動します。
cd myenv

次に、独立環境に切り替えます。Linuxなら次のように、
source bin/activate
Windowsなら次のようにコマンド入力します。
Scripts\activate

シェル(コマンドプロンプト)の先頭が
(myenv) ...
に切り替わったら、無事その環境に入れた証拠です。

この状態でPythonスクリプトをコマンドラインから実行すると、作成した環境の中で走らせることができます。

Linux系の環境の場合は、シバン(Shebang)で独立環境のpython.exeを指定すると、都度都度コマンドを打たなくても、その環境を使うことが可能です。

which python
もしwhichコマンドが使えるなら、whichコマンドで確認してみるのもよいかと思います。独立環境内のpython.exeが呼ばれていることが確かめられます。

独立環境から元に戻る

独立環境からぬけるには、コマンドで次のように打ち込みます。
deactivate

独立環境でのpipの利用

virtualenvが特に有効なのは、pipなどを使ってライブラリ・パッケージを出し入れするときかと思います。

virtualenvでは、setuptoolsとpipとが自動でインストールされるので、最初から使うことができます。ただ、setuptoolsは更新が止まっているので、setuptoolsに代わるdistributeを使うのがよいかと思います。setuptoolsの代わりにdistributeを入れるには、virtualenvコマンドに「--distribute」オプションをつけます。
virtualenv --distribute myenv2 && cd myenv2

あとは「Scripts\activate」で環境を切り替えてから「pip freeze」とすると、その環境の中のパッケージ一覧を確認することができます。
Scripts\activate
pip freeze

他のPCと環境を合わせたいときなんかには、コピー元の環境で
pip freeze > packages.txt
としてパッケージ一覧を作成しておき、コピー先で次のようにすると、同じパッケージ群をまとめてインストールすることができます。
pip install -r packages.txt

独立環境の削除

使い終わって用がなくなったら、最初にvirtualenvで作られたディレクトリごと削除すれば完了です。ここも、かんたん・便利です。


以上です。

virtualenvの使い勝手をさらによくするvirtualenvwrappervirtualenv-burritoといったツールなんかもあるようです。これらはWindowsではすぐには使えなかったり、私の場合はvirtualenvで間に合っていたりするので私は使っていませんが、virtualenvを使いたおすような方はこれらの利用も検討してみるとよいかもしれません。


参考
virtualenv - PyPI
2009年版Python開発環境を整えよう
1分でpython環境を整える方法 - mojavy.com

2013/08/06

ライブラリ:pip

Pythonの「pip」というライブラリ(パッケージ?)についてご紹介します。

pipは、いわゆる「パッケージ管理ツール」。Pythonのライブラリを手軽にインストールしたり管理したりすることができます。メインに使うのは、コマンドラインから使う「pip」コマンドです。

ブラウザなどを使わずにコマンドラインだけでパッケージをインストールしたりできるので、位置づけとしては、Rubyでいうところの「gem」、Linuxの「apt-get」「yum」「rpm」コマンドに近いイメージかなと思います。

以下、使い方を見ていきます。

01 pipそのもののインストール

pipを使うには、「setuptools」「distribute」のどちらかが必要です。

まずはそのどちらかをインストールし、コマンドラインから「easy_install」コマンドが使える状態にしておきます(setuptoolsは更新が止まっているようなので、今ならdistributeの方がおすすめです)。

その状態のもとで次のように打ち込むと、pipをインストールすることができます。
easy_install pip

02 pipを使ったパッケージのインストール

以下、pipを実際に使っていきます。

pip install virtualenv
パッケージをインストールするには、「pip install」を使います。「pip install」に続けてパッケージ名を入れると、pipが該当するパッケージを探してきて、ダウンロード・インストールしてくれます。依存しているパッケージがある場合は、依存関係を調べてあわせてインストールしてくれます。

パッケージ名の照合には、デフォルトでPyPIのパッケージ名一覧ページを使用するようです。

パッケージ名ではなく、URLを指定してインストールすることも可能です。オプションなどは必要なく、パッケージ名の部分にURLをそのまま打ち込みます。
pip install https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.8.4.tar.gz

使う機会はあまり多くはないかと思うのですが(私は使ったことがありません)、依存パッケージをインストールしない設定にしたり、パッケージ名の照合ページを変更したりすることなんかも可能です。

依存したパッケージを入れないなら。
pip install --no-deps virtualenv

パッケージ名の照合先のページを変更したいなら。
pip install --index-url=URL virtualenv

また、easy_installとpipをごちゃまぜで使っていると、easy_installで入れたパッケージがpipでは管理対象外となるなどするようですので、もしpipを使うのであればeasy_installは使わずpip一本に統一した方がよいようです。

03 インストール済みパッケージの確認

pip freeze
インストールされたパッケージを確認したいときは「pip freeze」を使います。各パッケージがパッケージ名とバージョンとをセットにして一覧表示されます。Rubyでいうところの「gem list」ですね。

04 インストールされたパッケージのアンインストール

pip uninstall virtualenv
過去にインストールしたパッケージをアンインストールしたい場合は、「pip uninstall パッケージ名」でできます。

05 パッケージのアップデート

pip install --upgrade virtualenv
パッケージのバージョンを更新するには「pip install」コマンドに「--upgrade」オプションを追加します。すでにpipでインストールできる最新のものが入っている場合はバージョン番号とメッセージが表示されて終了します。

06 おまけ

使い方を忘れてしまったときなんかにはヘルプを覗いてみるとよいかと思います。
pip help

また、複数のマシンに同じPython環境を入れたい場合、virtualenvでいつもお決まりのパッケージを入れている場合なんかには、一括インストール機能が便利です。

pip freeze > packages.txt
pip freezeで出力したパッケージ一覧を「-r」オプションをつけて「pip install」に渡すと、複数のパッケージの一括インストールが可能です。
pip install -r packages.txt

回数が増えてくると、ものすごく重宝します。

また、注意したい点としては、Windowsの場合は、pipではなく実行形式のインストーラ(.exe)を使ってインストールした方がよいものもあるため、実行形式のインストーラがあるかどうかは一度少し調べてから使うのがよいかと思います。

私に馴染んでいるものでいうと、
  • numpy
  • scipy
  • matplotlib
  • iPython
  • PIL
あたりのライブラリは、pipではなくインストーラを使った方がよいようです。

以上です。


私は長年Windowsばかり使ってきたため、pipのようなCUIベースのパッケージ管理ツールにはあまり馴染みがなかったのですが、一度慣れると、ものすごく便利で、、これはもう元には戻れない感じがします。。素晴らしいです。


参考
pip - PyPI
PyPI パッケージ名一覧
PIP公式ドキュメント
pipの使い方 - そこはかとなく書くよ。

2013/08/02

Pythonのprint文

Pythonのprint文についてご紹介します。

print '文字列'

Pythonで文字列を出力する、といえばprint文です。といっても、print文はPython2.*系以下でのみ実装されており、Python3からはprintは関数として位置づけられています。

以下、Python2.*系におけるprint文の使い方を、使用頻度が一般に高いとおもわれるものから順に見ていきます。

基本

s1 = 'world'
print "Hello"  # helloと表示
print s1  # worldと表示
最もベーシックな使い方は「print 表示したい文字列」です。

print文を普通に使うと、文字列の末尾で自動的に改行されます。Rubyのputsに近いイメージでしょうか。'(シンルグクォーテーション)と"(ダブルクォーテーション)にちがいはありません。

複数の引数

s1 = 'tonari no'
s2 = 'kyaku ha'
s3 = 'yoku kaki ku'
print s1, s2  # tonari no kyaku ha yoku kaki kuと表示
print文の場合「引数」と呼んでよいのかわかりませんが、引数を複数渡したい場合は「,」で区切ってつなげます。結果は、与えられた結果が半角スペースでつなげられたものとなります。

フォーマット指定

n1 = 1.414

print '%d' % n1  # 1
print '%f' % n1  # 1.414000
print '%0.1f' % n1  # 1.4
フォーマット指定は、「print フォーマット % 変数」という形で行います。

s1 = 'Hello'
s2 = 'world'

print '%s, %s' % (s1, s2)  # Hello, worldと表示
変数をひとつだけでなく複数個渡したい場合は、タプルを使います。

s1 = 'Hello'
s2 = 'world'

print '%(str1)s, %(str2)s' % \
        { 'str1': s1, 'str2': s2}
タプルではなく、辞書を渡して表示することもできます。この場合は、「%(キー名)フォーマット」という形でフォーマットを指定します。

たくさんの変数が渡したいとき、辞書の中身をフォーマットして表示したい場合なんかに便利です。

改行なし

print 'Hello',
print 'world'
# Hello worldと表示
print文を通常のやり方で使うと末尾に改行が自動で追加されてしまいます。これを避けるには、print文の最後に,(コンマ)を追加します。

この例では、Helloのあとの改行が半角スペースに変換されて表示されています。

import sys

sys.stdout.write('Hello')
sys.stdout.write('world')
# Helloworldと表示
「print 文字列,」という形だと改行の代わりに半角スペースがひとつ入ってしまうのですが、改行も半角スペースも入れたくない場合には、sys.stdout.write()という関数を使います。

ちなみに、print文は内部的にはこのsys.stdoutのラッパだそうです。

標準出力以外に出力

f = open('sample.txt', 'w')
print >> f, 'ABC EFG HIJ'
f.close()
# ファイルsamle.txtに文字列ABC EFG HIJが書き込まれる
出力先を標準出力から別のものに変えたい場合は、「print >> 出力先, 文字列」という形を使います。


その他

その他、特殊文字のエスケープやフォーマット指定子については、他の言語とよく似ているので、ここでは割愛します。

詳細は公式ドキュメントのprint文の箇所文字列フォーマットの箇所をごらんいただくとよいかと思います。

以上です。

繰り返しになりますが、ここで挙げたprint文はpython2.*系でのお話で、python3には適用できませんのでご注意ください。


参考
print文 - Python公式ドキュメント
string formatting operations - Python公式ドキュメント
Python - The difference between sys.stdout.write and print - Stack Overflow
Redirect stdout to a file in Python? - Stack Overflow
sys.stdout - Python公式ドキュメント