Python エクセルファイルを直接扱う #1

株式会社リュディアです。今回は Python でエクセルファイルを直接読み書きする方法についてまとめます。

まず最初に私は xlrd, xlwt パッケージを使っていたのですが、これらが Version 2.0.0 で xlsx をサポートしなくなりました。以下のリンクを見てもらうと "Remove support for anything other than .xls files."と書かれてますね。前は使えてたのですが。なぜでしょうか?

対応策は以下の 2つです。

1. エクセルを保存する際に xlsx ではなく古い形式 xls を指定

2. xlsx をサポートしていたxlrd version 1.2.0 を利用

今回のまとめでは xlsx ではなく xls ファイルを使って xlrd, xlwt の利用方法についてまとめていきます。xlrd から hard fork した xlrd3 と言うパッケージがあるそうですが私はまだ試せていません。興味のある方は試していただいて結果をお知らせいただけたらありがたいです。

では最初に xls ファイルを xlrd パッケージで読み込む方法をまとめます。例として以下の内容の note_read_sample.xls を用意しました。

画像1

では、以下のコード例をみてください。

import xlrd

book = xlrd.open_workbook('note_read_sample.xls')
print(book.sheet_names()) # 含まれているシート一覧をリスト形式で表示

sheet = book.sheet_by_name('Sheet1')

cell_c_3 = sheet.cell(2, 3)
print(cell_c_3) # セルの内容を表示

# ['Sheet1']
# text:'d_3'

まずファイルを xlrd.open_workbook( ) で open します。次にエクセルの 1 つのファイルに複数のシートが含まれる場合はシートを選択して内容を取り込みます。book.sheet_by_name('シート名') でシート名を指定してデータを取り込みます。取り込んだデータ sheet に対して sheet.cell(v, h) のように行インデクス v、列インデクス h の順でアクセスするとセルの内容を取得できます。cellのインデクスは v (縦方向)、h(横方向)の順に 0 からの数になります。

1 つセルの値を表示していますが text:'d_3' となっていますね。これはセルの値ではなく xlrd.sheet.Cell クラスの状態です。これらをセルの値とするには以下のように value を使います。以下の例を見てください。

import xlrd

book = xlrd.open_workbook('note_read_sample.xls')
print(book.sheet_names())

sheet = book.sheet_by_name('Sheet1')

cell_c_3 = sheet.cell(2, 3)
cell_5_0 = sheet.cell(5,0)
print(type(cell_c_3), type(cell_5_0), cell_c_3, cell_5_0)
print(type(cell_c_3.value), type(cell_5_0.value), cell_c_3.value, cell_5_0.value)

# ['Sheet1']
# <class 'xlrd.sheet.Cell'> <class 'xlrd.sheet.Cell'> text:'d_3' number:0.33
# <class 'str'> <class 'float'> d_3 0.33

たとえばセル (C, 3) の値を取得したい場合は sheet.cell(2, 3).value とする必要があります。value を使うことで type が str や float になっていることが確認できますね。

ここでは使いませんでしたが、他にセルに値が入っている最大行最大列の情報を取得する方法も以下に記載しておきます。

sheet.nrows : 値が含まれるセルの最大行番号を返す

sheet.ncols : 値が含まるセルの最大列番号を返す

今回はエクセルのファイルを直接読み込む方法として xlrd を紹介しました。

Python でエクセルファイルを直接扱う に関するまとめの続きは以下からどうぞ。

では、ごきげんよう。








いいなと思ったら応援しよう!