割と知られていないような気がするurlparseとoptparse (Python)

もう12月ですよ。
月日の経つのは早い早い…。

つい先ほど浅草で飲んできました。
一緒に飲んだのはプログラミング大好きな友人(・∀・)

途中、Pythonの話になったので「urlparse」と「optparse」を紹介してみた。
optparseを知っている人は結構いそうだけど、
urlparseは意外と知られていない気がする。

というわけで、簡単に紹介。

urlparseはURL形式の文字列を操作しやすくしてくれるモジュールです。
例えば、↓のような文字列。
‘http://www.google.co.jp/search?gcx=c&sourceid=chrome&ie=UTF-8&q=googlemap’
これをURLとして扱いやすくしませう。
あ、このモジュールはPython2.6.xからは標準で入っているはず…。
[shell]
>>> from urlparse import urlparse, parse_qs, urljoin
>>> url = ‘http://www.google.co.jp/search?gcx=c&sourceid=chrome&ie=UTF-8&q=googlemap’
>>> parsed = urlparse(url) # パースする

# こんな感じに解析してくれます(・∀・)
>>> print parsed
ParseResult(scheme=’http’, netloc=’www.google.co.jp’, path=’/search’, params=”, query=’gcx=c&sourceid=chrome&ie=UTF-8&q=googlemap’, fragment=”)

>>> print parsed.netloc
www.google.co.jp

>>> print parsed.query
gcx=c&sourceid=chrome&ie=UTF-8&q=googlemap

# パラメータも、parse_qs使うと辞書にしてくれます。
>>> params = parse_qs(parsed.query, True)
>>> print params
{‘sourceid’: [‘chrome’], ‘gcx’: [‘c’], ‘ie’: [‘UTF-8’], ‘q’: [‘googlemap’]}
[/shell]

知っておくとURL文字列を処理するときにすごく楽ですよ(・∀・)!オススメ。

あ、urljoinってのもあります。
[shell]
>>> url = ‘http://aaa.bbb.com/ddd/eee.html?hoge=fuga’
>>> print urljoin(url, ‘fff.html’)
http://aaa.bbb.com/ddd/fff.html
>>> print urljoin(url, ‘../ggg.html’)
http://aaa.bbb.com/ggg.html
>>> print urljoin(url, ‘/js/script.js’)
http://aaa.bbb.com/js/script.js
[/shell]
使いやすいですよ!

optparseは、バッチなど、コマンドラインで使うようなpythonを書いている人なら知ってるかと思います。
コマンド解析器ですね(・ω・)。結構使いやすいです。

以下、簡単なスクリプト。
test.py
[py]
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from optparse import OptionParser

if __name__ == ‘__main__’:

""" コマンドエラー時に表示する文字列 """
usage = u’%prog [Args] [Options]\nDetailed options -h or –help’

version = 0.1
parser = OptionParser(usage=usage, version=version)

""" test.py -d 20111201 のように、オプションの後に整数値を入力させたい場合 """
parser.add_option(
‘-d’, ‘–date’,
action = ‘store’,
type = ‘int’, # 受け取る値の型を指定する
dest = ‘download_date’, # 保存先変数名
help = ‘Set date(yyyymmdd) you want to download.(ex.20110811)’ # –help時に表示する文(見れば分かるかw)
)

""" 文字列が欲しい場合 (test.py -f hoge.txt) """
parser.add_option(
‘-f’, ‘–file’,
action = ‘store’,
type = ‘str’, # 型指定
dest = ‘file_name’, # 保存先変数名
help = ‘Set filename (ex. hoge.txt)’
)

""" -s を指定した場合、trueを保存する """
parser.add_option(
‘-s’, ‘–sleep’,
action = ‘store_true’, # store_trueの場合、Trueが’dest’で指定された変数へ格納される。(false時はstore_false)
dest = ‘hoge_flg’,
help = ‘set sleep flag’
)

""" 各オプションのデフォルト値をセット """
parser.set_defaults(
download_date = None,
file_name = None,
hoge_flg = False
)

""" オプションをパース """
options, args = parser.parse_args()

""" 単純な引数(例: test.py a b)はargs[index]で取得できる """
if len(args) > 0:
for i, v in enumerate(args):
print ‘Args[%s] is: %s’ % (i, v)

""" オプションで指定した値は options.<変数名>で取得できる """
date = options.download_date
if date:
if len(str(date)) != 8:
# エラーを発生させるときは↓こんな感じ
parser.error(‘Date must be yyyymmdd’)

print ‘date: %s, file: %s, sleep: %s’ % (options.download_date, options.file_name, options.hoge_flg)
[/py]

このファイルを –help オプションをつけて実行すると
[shell]
$ python test.py –help

Usage: test.py [Args] [Options]
Detailed options -h or –help

Options:
–version show program’s version number and exit
-h, –help show this help message and exit
-d DOWNLOAD_DATE, –date=DOWNLOAD_DATE
Set date(yyyymmdd) you want to download.(ex.20110811)
-f FILE_NAME, –file=FILE_NAME
Set filename (ex. hoge.txt)
-s, –sleep set sleep flag
[/shell]
このように、自動で説明文を生成してくれます。

parser.add_option の type で型を指定しておくと、
指定外の入力値の時に自動で弾いてくれます。
[shell]
$ python test.py -d abc

Usage: test.py [Args] [Options]
Detailed options -h or –help

test.py: error: option -d: invalid integer value: ‘abc’
[/shell]

Pythonでバッチ書く場合はオススメ(・∀・)
というわけで、使ってみて下さいね!!

さて寝よう。眠いし。

1件のコメント

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください