akiyoko blog

akiyoko の IT技術系ブログです

PythonでExcel操作

Pythonで Excelからデータを抜き出すサンプルを作ってみました。
実行環境は、Mac OS X 10.7.5、Python 2.7.1 です。

python-excel のインストール

Excel操作のライブラリとして、「python-excel」を使います。
python-excel は xlrd, xlwt, xlutilsというパッケージに分かれていて、読み込みだけなら xlrd だけ使えばよさげです。

Mac環境では easy_install で簡単にインストールできました。

$ sudo easy_install xlrd

xlrd 0.9.2 がインストールされました。

ちなみに、http://www.python-excel.org/ にGitHubのリンクがあるので、

$ git clone https://github.com/python-excel/xlrd.git
$ cd xlrd
$ python setup.py install

などとしてもインストールできると思います(が、試してません・・)。

Excelからデータの読み込み

つまずくとしたら、cell() の引数ですかね。それ以外は特に問題ありません。

test_excel.py

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import xlrd

if __name__ == '__main__':
    book = xlrd.open_workbook('/Users/akiyoko/Documents/temp/2nd_test.xls')  # ブック名
    sheet = book.sheet_by_name('Statistics (total score)')  # シート名
    data = []
    # データが「F10」から縦方向に並んでいるものとする
    # セルを cell(行番号, 列番号) で指定(0から数える)
    for row in range(9, sheet.nrows):
        value = sheet.cell(row, 5).value
        if value != '':
            data.append(value)
    print 'data=%s' % data

実行結果

$ python test_excel.py
data=[42.0, 42.0, 40.0, 38.0, 38.0, 38.0, 38.0, 35.0, 35.0, 35.0, 35.0, 34.0, 34.0, 34.0, 34.0, 33.0, 33.0, 33.0, 33.0, 32.0, 32.0, 32.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 30.0, 29.0, 29.0, 29.0, 28.0, 28.0, 28.0, 28.0, 28.0, 27.0, 27.0, 27.0, 27.0, 27.0, 27.0, 26.0, 26.0, 26.0, 26.0, 26.0, 26.0, 25.0, 24.0, 24.0, 24.0, 24.0, 23.0, 23.0, 23.0, 23.0, 23.0, 23.0, 23.0, 23.0, 23.0, 22.0, 22.0, 22.0, 22.0, 22.0, 22.0, 22.0, 22.0, 21.0, 21.0, 20.0, 20.0, 20.0, 20.0, 20.0, 19.0, 19.0, 19.0, 19.0, 19.0, 18.0, 18.0, 17.0, 17.0, 16.0, 16.0, 16.0, 16.0, 15.0, 15.0, 15.0, 15.0, 14.0, 13.0, 13.0, 13.0, 13.0, 12.0, 12.0, 11.0, 9.0]

平均・標準偏差などを求める

ついでに、データの平均や標準偏差などを求めてみます。
高度な計算ライブラリには「NumPy」(ナンパイ)を使います。

ちなみに NumPy は、Mac環境 (OS X 10.7.5) に既にインストールされていました。
特にインストールした覚えはないので、過去に入れた

のどちらかのタイミングでインストールされたのだと思います(もしかしたら初めから入ってたのかも)。

test_calculate.py

#! /usr/bin/env python
# -*- coding: utf-8 -*-

import numpy
import xlrd

if __name__ == '__main__':
    book = xlrd.open_workbook('/Users/akiyoko/Documents/temp/2nd_test.xls')
    sheet = book.sheet_by_name('Statistics (total score)')
    data = []
    for row in range(9, sheet.nrows):
        value = sheet.cell(row, 5).value
        if value != '':
            data.append(value)
    # なるべくnumpy.arrayを使う(ただし、for文では使わないように注意)
    data = numpy.array(data)
    print 'data=%s' % data
    # データ数
    print 'size of data=%d' % len(data)
    # 平均
    print 'mean value=%.1f' % numpy.mean(data)
    # 中央値
    print 'median value=%.1f' % numpy.median(data)
    # 標準偏差
    print 'standard deviation=%.2f' % numpy.std(data)

実行結果

$ python test_calculate.py 
data=[ 42.  42.  40.  38.  38.  38.  38.  35.  35.  35.  35.  34.  34.  34.  34.
  33.  33.  33.  33.  32.  32.  32.  30.  30.  30.  30.  30.  30.  30.  30.
  29.  29.  29.  28.  28.  28.  28.  28.  27.  27.  27.  27.  27.  27.  26.
  26.  26.  26.  26.  26.  25.  24.  24.  24.  24.  23.  23.  23.  23.  23.
  23.  23.  23.  23.  22.  22.  22.  22.  22.  22.  22.  22.  21.  21.  20.
  20.  20.  20.  20.  19.  19.  19.  19.  19.  18.  18.  17.  17.  16.  16.
  16.  16.  15.  15.  15.  15.  14.  13.  13.  13.  13.  12.  12.  11.   9.]
size of data=105
mean value=24.9
median value=24.0
standard deviation=7.44