2013/05/31

ライブラリ:xlwt

Pythonの「xlwt」というライブラリについてご紹介します。

import xlwt

「xlwt」は、PythonからExcelファイル(xls)に書き込むためのライブラリです。読み込む方の「xlrd」と対になっています。

機能はシンプルで、1)ブックとシートを作成して、2)シートに書き込む、という流れで使います。xlrdと同じく、「ブック→シート→セル」という構成を頭に置いておくと理解しやすいかと思います。

以下、使い方を見ていきます。

データの保存

import xlwt

# データを保存するファイルとシートの名前
FILE = 'test.xls'
SHEET = 'testSheet01'

# WorkbookとWorksheetを作成
book = xlwt.Workbook()
s = book.add_sheet(SHEET)

# データをシートに書き込み
mydata = [1, 2, 3, 4, 5]
for i, ele in enumerate(mydata):
    # 0行、i列目にデータeleを書き込み
    s.write(0, i, ele)

# ファイルに保存
book.save(FILE)
データを保存するために最小限必要なのは
  • Workbook()
  • add_sheet()
  • write()
  • save()
の4つです。流れとしては、ブックを開いて、シートを追加して、シートに書き込んで、ブック全体をファイルに保存、という形になります。

現状、既存のファイルに追加書き込みをすることはできないため、原則新規作成です。

関数の使用

s.write(1, 0, xlwt.Formula('SIN(A1) * 2'))
セルに値ではなくExcelの関数を挿入したい場合は、Formulaオブジェクトを使います。上記のようにすると、上から2行目、左から1つめのセル(A2セル)に数式「SIN(A1) * 2」が書き込まれます。Excel上で数式を書くときの=(イコール)は必要ありません。

余談ですが、数式の中で他のセルを指定する場合、「A1」「B4」といった形での指定になります。行番号の部分は整数でシンプルでいいのですが、列番号の部分は「A, B, C, ..., Z, AA, AB, AC, ...」といった形でアルファベットによる26進法になるので、少し工夫が必要です。26列目よりも右側(AA以降)を使う場合には、たとえば、次のように、列指定のためのCOLというリストをひとつ作っておくと便利です。
COL = []
ALPHA = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
ALPHAS = ' ' + ALPHA
for d1 in ALPHAS:
    for d2 in ALPHA:
        COL.append((d1 + d2).strip())
print COL
# COL = ['A', 'B', ...'Z', 'AA', 'AB', ...]

書式の設定

style0 = xlwt.easyxf(strg_to_parse='font: name Meiryo, color-index red, bold on',
                     num_format_str='#,##0.00')
s.write(2, 0, 12.3, style0)
セルの書式を設定するには、easyxf()という関数を使います。ふたつの引数strg_to_parse、nu_format_strのうち、前者はフォントやアラインメント(セル内での表示位置)などを指定します。後者は、数値や日付のフォーマットを指定するのに使います。

以上です。

xlwtは、OSがWindowsでなくても動作するということでその点は便利なのですが、名前付きセル、フィルタ、ピボットテーブルといった機能は現状備えていないようです。ですので、何か凝ったことをしようとするのではなく、あくまでも、データをエクセルに保存する、というシンプルな使い方に留めておいた方が良さそうです。


インストール
pip」が入っていれば、コマンドから「pip xlwt」と打つとインストールすることができます。


参考
xlwt - pypi
Examples Generating Excel Documents Using Python’s xlwt - if(you.like('programming'))
Excel書き込み (xlwt) - python入門から応用までの学習サイト

2013/05/24

ライブラリ:xlrd

Pythonの「xlrd」というライブラリについてご紹介します。
import xlrd

「xlrd」は、Excel(xls)のデータをPythonで読むためのライブラリです。「xlrd」というのはおそらく「excel read」の省略形で、対となる「xlwt」というものも存在します。

xlrdでは、「Book→Sheet→Cell」という構造でエクセルデータを抽出します。

まずはBookから。

Excelファイルを開くには、関数open_workbook()を用います。CSVファイルを開く関数csv.reader()の場合は、ファイルオブジェクトを引数に取りましたが、xrdの場合はファイル名を直接受け取ります。
FILE = 'excelbook.xls'
book = xlrd.open_workbook(FILE)

open_workbook()でExcelファイルを開いたら(Bookオブジェクトを作成したら)、アトリビュートやメソッドを使ってその中身の情報にアクセスすることができます。
# 文字コード
print 'encoding:', book.encoding

# シートの枚数
print 'number of sheets:', book.nsheets

# シートの一覧(名前、データの入った行と列の数)
print 'sheets:'
for s in book.sheets():
    print '%s %sx%s' % (s.name, s.nrows, s.ncols)
シートの中身を取得するには、BookからSheetオブジェクトを取得した後、cell()メソッドを使います。
# Sheet1という名前のシートを取得
s = book.sheet_by_name('Sheet1')

print s.cell(1, 3)  # 指定した行・列のCellオブジェクトを取得
print s.cell_type(1, 3)  # セルのtypeを取得
print s.cell_value(1, 3)  # セルのvalueを取得
Sheetを取得するには、シートの名前で取得する方法sheet_by_name()とシートのインデックスで取得する方法sheet_by_index()とがあります。

各セルには「type」と「value」という情報が入っています。typeには文字列、数値といったセルのフォーマット情報が、valueにはデータの値が入っています。typeは
  • 1: 文字列
  • 2: 数値
  • 3: 日付
といった形であらかじめ番号が割り当てられているので、詳細は公式のドキュメントのセルについての部分でご確認いただくとよいかと思います。

行番号、列番号が0始まりの数字であることに注意が必要です。0始まりなので、たとえば、cell(1, 3)とした場合は、エクセル上で見ると、上から2行目、左から4列目のセルにアクセスしていることになります。

セル単位ではなく、行単位、列単位でデータを取得したい場合のために、row()、col()といった関数も用意されています。
s.row(0)  # 最初の行のセルをリストで取得
s.col(0)  # 最初の列のセルをリストで取得
s.col_values(0)  # 最初の行の値をリストで取得

以上です。


インストール
「setuptools」と「pip」が入っていれば、コマンドから「pip install xlrd」と打つとインストールできます。


参考
xlrd - pypi
Python Excel
xlrd extension - Lingfo

2013/05/14

ライブラリ:csv

Pythonの「csv」というライブラリについてご紹介します。

import csv

「csv」は、CSVファイルの取り扱いをカンタンにしてくれるライブラリです。おもな機能はCSVの「書き込み」と「読み込み」です。以下、順に見ていきます。

CSVファイルへの書き込み

import csv

FILE = 'sample.csv'

title = ['a', 'b', 'c', 'd', 'e']
mylist = [[10, 68, 43, 25, 64],
          [42, 62, 34, 67, 36],
          [44, 41, 59, 77, 68],
          [90,  7, 24, 91, 82],
          [42, 64, 43,  6, 96],
          [76, 74, 62, 64, 66],
          [ 1, 96, 91,  0, 79]]

f = open(FILE, 'wb')

c = csv.writer(f)  # CSV書き込み用オブジェクトの生成
c.writerow(title)  # 1行書き込み
c.writerows(mylist)  # 複数行書き込み

f.close()
CSVファイルへの書き込みはまず、ファイルを開いた後、writer()関数でcsv writerオブジェクトを生成します。その後そのwriterオブジェクトを使って、1行ずつ、あるいは複数行まとめて書き込んでいきます。1行の場合はwriterow()、複数行の場合はwriterows()が使えます。

この例では次のような内容のcsvファイルが作られます。
a,b,c,d,e
10,68,43,25,64
42,62,34,67,36
44,41,59,77,68
90,7,24,91,82
42,64,43,6,96
76,74,62,64,66
1,96,91,0,79

CSVファイルの読み込み

f = open(FILE, 'rb')

mylist2 = []
c = csv.reader(f)  # CSV読み込み用オブジェクトの生成
for row in c:
    mylist2.append(row)
print mylist2

f.close()
CSVファイルの読み込みも、保存とほぼ同じ形で行います。保存がwriter()を使ったのに対し、読み込みではreader()を使います。reader()オブジェクトはイテレータとして扱うことができます。

また、区切り文字やデータを囲うための文字についてはオプションによって指定することが可能です。たとえば、区切り文字が空白で、コンマを含むデータを囲う文字が「|」の場合は
c = csv.reader(f, delimiter=' ', quotechar='|')
と書くことができます。

さらに、ファイルへの書き込みについては、「データを囲うための文字をどのぐらい使うのか」という部分も指定することが可能です。quotingオプションを使います。たとえば、コンマを含むような必要最小限のデータのみを囲いたいときは
c = csv.writer(f, delimiter=' ',
    quotechar='|', quoting=csv.QUOTE_MINIMAL)
とします。その他のスタイルとしては
csv.QUOTE_ALL すべてのデータを囲う
csv.QUOTE_NONNUMERIC 非数値データをすべて囲う
csv.QUOTE_NONE 囲いは使わない
などを選択することが可能です。

・・・以上です。


インストール
「csv」は標準ライブラリに含まれているので、Pythonと別途インストールする必要はありません。


参考
csv - Python公式ドキュメント
csv - Python-izm
csv - Doug Hellmann

2013/05/06

ライブラリ:pickle

Pythonの「pickle」というライブラリについてご紹介します。

import pickle

「pickle」は、Pythonオブジェクトをファイルに保存するためのライブラリです。保存したものをまた読み出してくるための関数もあわせて用意されています。

私の認識だと、ただ「ファイルに保存するためのもの」という感じなのですが、OOPではこの処理を「シリアライズ(serialize)」「デシリアライズ(deserialize)」と呼ぶそうです(Wikipedia)。

ちなみに、pickleは「ピクルス」のピクルでいわゆる「漬物」のこと。オブジェクトを漬けるというたとえでしょうか。

pickleの使い方はとてもシンプルです。以下、pickleの使い方について述べてみます。

オブジェクトをファイルに保存する

pickleでファイルに保存するには、pickle.dump()を使います。
mydict = {1: 'Pochi',
          2: 'Taro',
          3: 'Jiro'}
with open('xxx.dump', 'w') as f:
    pickle.dump(f, mydict)

2つの引数のうち、最初のもの(f)は「書き込む可能なファイルオブジェクト」、ふたつめ(mydict)には「保存したいオブジェクト」を指定します。

追記: 上のコードおよび説明が間違っておりました。正しくは、 pickle.dump() に渡す 2 つの引数は、最初の引数が「保存したいオブジェクト」で 2 つめが「書き込み可能なファイルオブジェクト」です。ですので該当行も次のとおりにするのが正解です。

with open('xxx.dump', 'w') as f:
    pickle.dump(mydict, f)

こうすると、「xxx.dump」というファイルが作られ、この中にmydictがシリアライズされて保存されます。

オブジェクトをファイルから読み出す

いったんpickleしたオブジェクトをファイルから再び取り出すには、pickle.load()を使います。
with open('xxx.dump', 'r') as f:
    mydict_load = pickle.load(f)
    print mydict_load  # {1: 'Pochi', 2: 'Taro', 3: 'Jiro'}

引数には、読み込む可能なファイルオブジェクトを渡します。

メインはこのdump()とload()の2つで、あとは、これをファイルではなく文字列にしたい場合のためのdumps()、loads()などが用意されている形です。


今回は辞書型のオブジェクトを使いましたが、pickleではほかにもさまざまなオブジェクトを扱うことができます。公式ドキュメントによるとpickle可能なものとして次のものが挙げられています。
  • None True False
  • 整数型 浮動小数点型 複素数型
  • 文字列
  • タプル リスト セット 辞書
  • モジュールのトップレベルで定義された関数
  • モジュールのトップレベルで定義されたビルトイン関数
  • モジュールのトップレベルで定義されたクラス
  • __dict__がpickle可能なインスタンス

・・・以上です。


インストール
「pickle」は標準ライブラリに含まれているので、Pythonと別途インストールする必要はありません。


参考
pickle - Python公式ドキュメント
Pythonオブジェクトをシリアライズする - Dive Into Python 3 日本語版