初めてのPython

2008/07/17

僕は普段RubyやPerlを使っていますが、先日久々にCOBOLを使ってみたのに続いて突然Pythonがやりたくなったので使ってみました。

Googleをはじめとして欧米でPythonが広く使われていることもありますが、Rubyと同様オブジェクト指向スクリプト言語であることも魅力で、特にブロックをインデントで表すという「見た目を言語仕様の一部にする」という特徴が気に入りました。

インストール

まずインストールですが、メインマシンのFedora 9には最初から入っていました。

% which python
/usr/bin/python

% python -V
Python 2.5.1

必要があれば外部のライブラリもインストールします。

ここではRSSをパースするライブラリであるfeedparserをインストールします。

% unzip feedparser-4.1.zip
% sudo python setup.py install

ライブラリは/usr/lib/python2.5/site-packages配下にインストールされます。

feedparser.py ... ソース
feedparser.pyc ... コンパイル済バイナリ
feedparser-4.1-py2.5.egg-info ... ドキュメント

プログラミング

次にサンプルとしてRSSをパースするプログラムを書いてみました(パースには上記でインストールしたfeedparserを使用)。

#!/usr/bin/python

import feedparser
import email.Utils
import time

file = "rss20.xml"

# Feedのパース
feed = feedparser.parse(file)

# Feedの基本情報
print 'feed info'
print '- version    :', feed.version
print '- encoding   :', feed.encoding
print '- feed title :', feed.feed.title
print '- feed url   :', feed.feed.link

# Feedの各エントリ
print 'entry'
for num, entry in enumerate(feed.entries):
	entry_date = time.strftime('%Y/%m/%d', email.Utils.parsedate(entry.date))
	print '-', num, ':', entry_date, ':', entry.title, ':', entry.link

これを当サイトのRSSに対して実行すると以下のような結果になります。

feed info
- version    : rss20
- encoding   : utf-8
- feed title : Life with IT
- feed url   : http://l-w-i.net/
entry
- 0 : 2008/07/16 : [技術資料] Solaris資料追加(ツール 1件) : http://l-w-i.net/t/solaris
- 1 : 2008/07/15 : [技術資料] OpenSSH資料更新(導入/環境管理 1件) : http://l-w-i.net/t/openssh
- 2 : 2008/07/14 : [技術資料] Solaris資料追加(導入/環境管理 1件) : http://l-w-i.net/t/solaris
- 3 : 2008/07/12 : [レポート] 「Mashup Caravan in TOKYO」行ってきました : http://l-w-i.net/r/20080712_01.txt
- 4 : 2008/07/10 : [開発日誌] Microformatsに少し対応(hAtom) : http://l-w-i.net/d/20080710_01.txt
- 5 : 2008/07/07 : [技術資料] Fedora資料追加(ボリューム/ファイルシステム 1件) : http://l-w-i.net/t/fedora
- 6 : 2008/07/06 : [技術資料] Fedora資料追加(ネットワーク 1件) : http://l-w-i.net/t/fedora
- 7 : 2008/07/05 : [技術資料] Solaris資料更新(導入/環境管理 1件) : http://l-w-i.net/t/solaris
- 8 : 2008/07/04 : [技術資料] memcached資料追加(導入/環境管理 1件) : http://l-w-i.net/t/memcached
:

ブロックの範囲を示す括弧がないのはいくつかの言語で慣れていますが、ブロックの終了を表すendやdoneの類がないのが新鮮です。

またサンプルの中でも使っていますが、ループ中に連番を取得するためのenumerate()という関数が用意されていて、普通なら自分でカウンタを用意すべきところを以下のように自動的に処理してくれます。これはかなり便利です。

for i, data in enumerate(['a', 'b', 'c']):
	print i, ':', data

(実行結果)

0 : a
1 : b
2 : c

他にも気の利いた機能がありそうなのでいろいろ遊んでみようと思っています。