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
他にも気の利いた機能がありそうなのでいろいろ遊んでみようと思っています。