2015/07/29

Python Tips:pip そのものをアップデートしたい

Python のパッケージ管理コマンドである pip 自身をアップデートする方法をご紹介します。

pip は pip そのものが PyPI パッケージとなっているので pip コマンドでアップデートすることができます。 PyPI パッケージをアップデートするには `pip install` に `--upgrade` オプションを付けて実行します。

$ pip install --upgrade pip

しばらく気づきませんでしたが、 2014 年の年末頃のアップデートから pip のバージョンが 1.5 から 6.0 となり、最初の 1 を取った形でのバージョン表記になったようです。引き続き活発に開発が進められているようで頼もしいです。

参考
python - How do I update pip itself from inside my virtual environment? - Stack Overflow
pip 公式ドキュメント

2015/07/16

Python Tips:Requests ライブラリのレスポンスボディの文字化けを解消したい

シンプルで使いやすい Python の HTTP ライブラリ Requests を使っているときに文字化けを解消する方法をご紹介します。

import requests

URL = 'http://www.1101.com/home.html'

r = requests.get(URL)

if r.status_code == 200:
    print(r.text.encode('utf-8'))  # => 文字化けしたテキスト

    # 文字化けの原因はエンコーディング
    print(r.encoding)  # => 'ISO-8859-1'

    # エンコーディングを変更すると
    # 自動で文字化けが解消されたテキストが取得できるようになる 
    # エンコード utf-8 の部分は状況に応じて変更すれば OK
    r.encoding = 'Shift_JIS'
    print(r.text.encode('utf-8'))

気をつけるべきポイントとしては、 requests の Response オブジェクトのプロパティ text は unicode にデコードされている形がデフォルトという点です。
Python2.7 の場合( Python3 の場合は未確認です )、 HTTP レスポンスの生のボディを格納した content プロパティは str 型であるため、このあたりのちがいに注意が必要です。

import requests

URL = 'http://www.1101.com/home.html'

if r.status_code == 200:
    r = requests.get(URL)
    print(type(r.text))  # => unicode
    print(type(r.content))  # => str


参考
Response Content — Requests 公式ドキュメント

2015/07/08

Python で基本アルゴリズム:バブルソート

Python でバブルソートを行うコードをご紹介します。

# coding: utf-8

def bubble_sort(li):
    """バブルソートでソートしたリストを返す
    """
    li_sorted = li[:]

    for i in range(0, len(li_sorted)):
        for j in range(1, len(li_sorted) - i):
            if li_sorted[j - 1] > li_sorted[j]:
                swap(li_sorted, j)
                # 確認用に途中経過を表示する場合は次の行のコメントを外す
                # print(li_sorted)

    return li_sorted

def swap(li, index):
    """リストの隣り合った要素 index -1 & index の値を入れ替える
    """
    li[index], li[index - 1] = li[index - 1: index + 1]


if __name__ == '__main__':
    # テスト
    print(bubble_sort([8, 5, 2, 1]))  # => [1, 2, 5, 8]
    print(bubble_sort([1, 5, 3]))     # => [1, 3, 5]

swap の部分は必ずしも切り出す必要はないかと思います。


参考
バブルソート - Wikipedia

2015/07/07

Python Tips: Web サービスの JSON を処理したい

HTTP リクエストに対して JSON 形式でデータや処理の結果を返すタイプのサービスを Python で利用する方法をご紹介します。

私が知るかぎり、最もかんたんな方法は requests ライブラリを使う方法です。

import requests

URL_JSON = 'http://www.lifewithpython.com/feeds/posts/default?alt=json'

r = requests.get(URL_JSON)

# 無事レスポンスが返ってきたら中身を出力
if r.status_code == 200:
    # json を取得
    j = r.json()

    # キーを表示
    print(j.keys())  # => [u'feed', u'version', u'encoding']

    # 各エントリのタイトルを一覧で表示
    entries = j['feed']['entry']
    for e in entries:
        print(e['title']['$t'])

requests ライブラリの get 関数などが返す requests.models.Response オブジェクトには json() というメソッドがあり、これは JSON の中身をパース済みの値となっています。具体的には list 型や dict 型です。