Python」カテゴリーアーカイブ

Pythonのリスト内包表記がステキ

Pythonにはリスト内包表記というステキな機能がある。
最近かなり活用しているので、メモっとく。

テストデータとかで、大量の連番リストが欲しいとかよくあるよね。
馬鹿正直に書くとこうなる。

a = []
for i in xrange(0, 100):
    a.append(i)

リスト内包表記で書くとこうなる。

a = [i for i in xrange(0, 100)]

一行で書けちゃった。

これだけだと短く書けるだけじゃん、となるけど、さらに条件式も入れられる。
例えば、既存のリストから、偶数だけを抜き出すコードを書いてみる。

b = [i for i in a if i % 2 == 0]

条件式が書けるため、リストから条件に合うものを抜き出す処理がサクッとかけて、実に便利だ。
Python使うなら覚えておいて損はないと思う。

PyCryptoでAES暗号を使ってみた

PythonでAES暗号を取り扱わなければならなくなったので備忘録代わりにメモ。
まずはPyCryptoをインストール。

$ pip install PyCrypto

それではAESの暗号化、復号化してみるよ。
こんなコード書いてみた。
CBCモードで初期ベクトルは乱数を使ってる。

import os
import hashlib

from Crypto.Cipher import AES

# key and initial vector
secret_key = hashlib.sha256('This is secret passphrase.').digest()
iv = os.urandom(16)

# plain text
plain_text = 'A' * 16

# encrypt
aes = AES.new(secret_key, AES.MODE_CBC, iv)
encrypt_data = aes.encrypt(plain_text)

# decrypt
aes = AES.new(secret_key, AES.MODE_CBC, iv)
decrypt_data = aes.decrypt(encrypt_data)

# output result
print 'plain text: %s' % (plain_text)
print 'initial vector: %s' % (iv.encode('hex'))
print 'encrypt: %s' % (encrypt_data.encode('hex'))
print 'decrypt: %s' % (decrypt_data)

そいでは実行してみましょう。

$ python test001.py
plain text: AAAAAAAAAAAAAAAA
initial vector: 1e37825a3af0345564c9694c4e0a65e7
encrypt: b631aa2387fc7870b38e2008b44e5c0e
decrypt: AAAAAAAAAAAAAAAA

$ python test001.py
plain text: AAAAAAAAAAAAAAAA
initial vector: c881768a26d219bde12e708e588d5e3b
encrypt: d3fb0ac082c734c0b66e58c501c40e74
decrypt: AAAAAAAAAAAAAAAA

$ python test001.py
plain text: AAAAAAAAAAAAAAAA
initial vector: eedff20172c9712f1493ca0d1b482b33
encrypt: 353823f2a4d25e7f3050e0d99e079538
decrypt: AAAAAAAAAAAAAAAA

うん、ちゃんと動いてるみたい。

webサーバを5秒で立ち上げるたったひとつの冴えたやりかた

webサーバが欲しい。とても欲しい。でもApacheとか入れてる暇ないよ。
そんなことよくありますね。
そんな時、悩むことなく5秒でwebサーバが立ち上げられます。そうPythonならね。

$ python -m SimpleHTTPServer 8080

これでポート8080でHTTPを待ち受けるぜ。
DocumentRootはカレントだ!
まあ、セキュリティもクソもないので、絶対に外部に晒そうとか思っちゃダメだぜ。

あとでちゃんとかく

まともに使えるPython環境の作り方。 pipとVirtualenv編。
まずはeasy_install。

$ sudo apt-get install python-setuptools

pip入れる。

$ sudo easy_install pip

apt-getで入るやつはバージョンが古いのでやめておけ。

virtualenvとvirtualenvwrapper入れる。

$ sudo pip install virtualenv
$ sudo pip install virtualenvwrapper

.bashrcに設定追加。

export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python2.7
export VIRTUALENVWRAPPER_VIRTUALENV=/usr/local/bin/virtualenv
export WORKON_HOME=$HOME/.virtualenvs
source /usr/local/bin/virtualenvwrapper.sh

新しいvirtualenv環境作る。

$ mkvirtualenv hoge

virtualenv環境に入る。

$ workon hoge

ざっとこんなもん。

PythonでURLを弄るだけの簡単なお仕事

PythonでちょいとばかりURLを弄る必要があったのでメモ。
あるいは、urlparseモジュールで遊んでみたとも言えよう。
まあ、話は簡単でこんなURLがあるとしますぜ。

http://www.sample.co.jp/apps/view?lang=ja&code=utf-8&id=123#top

こいつをこんな感じにパースしたいと。

www.sample.co.jp, /apps/view, lang=ja%code=utf-8%id=123, top

イメージできた?
難しく言うと、ホスト部とパス部、パラメータ群、HTMLで言うところの#hogehogeのあれ、にそれぞれ分割したい。

さっそくgoogle様に教えを請うたところ、urlparseモジュールを使いなさいと。
ふむ、ではいじってみましょう。

$ python
>> import urlparse
>>> parse_url = urlparse.urlparse('http://www.sample.co.jp/apps/view?lang=ja&code=utf-8&id
=123#top')
>>> parse_url
ParseResult(scheme='http', netloc='www.sample.co.jp', path='/apps/view', params='', query='lang=ja&code=utf-8&id=123', fragment='top')
>>> parse_url.netloc
'www.sample.co.jp'
>>> parse_url.path
'/apps/view'
>>> parse_url.query
'lang=ja&code=utf-8&id=123'
>>> parse_url.fragment
'top'

何だあっさりと出来ちまったぜ。さすがPython、恐るべし。

ここまで来るとURLにくっついてきているパラメータもパースしたいですね。

>>> urlparse.parse_qsl(parse_url.query)
[('lang', 'ja'), ('code', 'utf-8'), ('id', '123')]

これまたurlparseモジュールでできちゃったよ。
タプルは扱いづらいよぅ、せめてdictに。という場合はdict()にぶち込めばいい。

>>> dict(urlparse.parse_qsl(parse_url.query))
{'lang': 'ja', 'code': 'utf-8', 'id': '123'}