Pythonライブラリ xlrd 詳細解説:古いExcelファイル操作の定番

Python

はじめに:xlrdとは? 🤔

xlrdは、Pythonプログラミング言語で使用されるライブラリの一つで、主に古い形式のExcelファイル(拡張子が .xls のファイル、具体的にはExcel 97からExcel 2003までのバージョン)からデータを読み取るために開発されました。Excelファイルをプログラムで扱いたい場面、例えば大量のデータ抽出や定型的な処理の自動化などで活躍します。

このライブラリは、WindowsやExcelがインストールされていない環境(LinuxやmacOSなど)でも動作するのが大きな利点です。純粋なPythonで実装されており、Excelファイルの内部構造(BIFF形式)を解析してデータを取り出します。

🚨 非常に重要な注意点: xlrdライブラリは、バージョン2.0.0(2020年12月リリース)以降、.xlsx形式(Excel 2007以降の標準形式)のファイルのサポートを完全に廃止しました。 現在のxlrd.xls形式のファイル専用のライブラリとなっています。この変更は、.xlsxファイルのXML構造に起因する潜在的なセキュリティ脆弱性への懸念から行われました。したがって、モダンな.xlsxファイルを扱いたい場合は、xlrdではなく、openpyxlpandasといった他のライブラリを使用する必要があります。 この点は、xlrdを利用する上で絶対に理解しておくべき最も重要な制限事項です。

このブログでは、xlrdの基本的な使い方から、その機能、そして重要な制限事項と代替ライブラリについて詳しく解説していきます。

xlrdのインストール方法 💻

xlrdライブラリを使用するには、まずPython環境にインストールする必要があります。Pythonのパッケージ管理ツールであるpipを使うのが最も一般的で簡単な方法です。

ターミナル(Windowsの場合はコマンドプロンプトやPowerShell)を開き、以下のコマンドを実行してください。

pip install xlrd

これにより、Python Package Index (PyPI) から最新バージョンのxlrdがダウンロードされ、インストールされます。

特定のバージョンをインストールしたい場合は、以下のようにバージョン番号を指定します(例:バージョン1.2.0をインストールする場合)。

pip install xlrd==1.2.0

ただし、前述の通り、バージョン2.0.0未満のxlrdには.xlsxファイルを読み込む機能がありましたが、セキュリティ上のリスクやメンテナンスが停止していることを考慮すると、古いバージョンを意図的にインストールすることは推奨されません。 .xlsxファイルを扱いたい場合は、後述する代替ライブラリを使用してください。

インストールが正常に完了したか確認するには、以下のコマンドを実行します。

pip show xlrd

これにより、インストールされているxlrdのバージョンや場所などの情報が表示されます。

Pythonスクリプト内でxlrdを使用する準備がこれで整いました。次は、実際にxlrdを使って.xlsファイルを読み込む方法を見ていきましょう。

基本的な使い方:Excelファイル(.xls)の読み込み 📖

xlrdを使ってExcelファイル(.xls形式限定)からデータを読み取る基本的な手順を解説します。簡単なサンプルコードを交えながら見ていきましょう。

1. ライブラリのインポート

まず、Pythonスクリプト内でxlrdライブラリを使えるようにインポートします。

import xlrd

2. ワークブックを開く

次に、読み込みたい.xlsファイルを指定してワークブックオブジェクトを開きます。open_workbook()関数を使用します。ファイルパスは適切に指定してください。

# 'example.xls' は実際のファイルパスに置き換えてください
try:
    workbook = xlrd.open_workbook('example.xls')
    print("ワークブックを正常に開きました。")
except FileNotFoundError:
    print("エラー: 指定されたファイルが見つかりません。")
except xlrd.biffh.XLRDError as e:
    print(f"エラー: Excelファイルの読み込みに失敗しました。{e}")
    # ここでプログラムを終了するか、エラー処理を行う
    exit()
except Exception as e:
    print(f"予期せぬエラーが発生しました: {e}")
    exit()

⚠️ 注意: ここで指定するファイルは必ず.xls形式である必要があります。.xlsxファイルを指定すると、xlrd.biffh.XLRDError: Excel xlsx file; not supported というエラーが発生します(xlrdバージョン2.0.0以降)。

3. シート情報の取得

ワークブックオブジェクトから、含まれるシートに関する情報を取得できます。

# シート数を取得
num_sheets = workbook.nsheets
print(f"シート数: {num_sheets}")

# すべてのシート名を取得
sheet_names = workbook.sheet_names()
print(f"シート名: {sheet_names}")

4. シートへのアクセス

特定のシートにアクセスするには、インデックス(0から始まる番号)またはシート名を使用します。

# インデックスでシートを取得 (最初のシート)
sheet = workbook.sheet_by_index(0)
print(f"インデックス0のシート名: {sheet.name}")

# シート名でシートを取得 (名前が 'Sheet1' のシート)
try:
    sheet_by_name = workbook.sheet_by_name('Sheet1')
    print(f"名前 'Sheet1' でシートを取得しました。")
except xlrd.XLRDError:
    print("エラー: 'Sheet1' という名前のシートは見つかりません。")
    # 最初のシートを代わりに使うなどの代替処理
    sheet_by_name = workbook.sheet_by_index(0)

5. セルデータの読み込み

シートオブジェクトから、特定のセルのデータを読み取ることができます。行インデックス(rowx)と列インデックス(colx)はどちらも0から始まります。

# 最初のシートを取得 (インデックス0)
sheet = workbook.sheet_by_index(0)

# セルの値を取得 (A1セル: rowx=0, colx=0)
try:
    cell_a1_value = sheet.cell_value(rowx=0, colx=0)
    print(f"セルA1の値: {cell_a1_value}")
except IndexError:
    print("エラー: 指定されたセルが存在しません (A1)。")

# セルの値を取得 (B2セル: rowx=1, colx=1)
try:
    cell_b2_value = sheet.cell_value(rowx=1, colx=1)
    print(f"セルB2の値: {cell_b2_value}")
except IndexError:
    print("エラー: 指定されたセルが存在しません (B2)。")

# Cellオブジェクトを取得 (C3セル: rowx=2, colx=2)
try:
    cell_c3 = sheet.cell(rowx=2, colx=2)
    print(f"セルC3のオブジェクト: {cell_c3}")
    print(f"セルC3の値: {cell_c3.value}")
    print(f"セルC3のデータ型: {cell_c3.ctype}") # データ型については後述
except IndexError:
    print("エラー: 指定されたセルが存在しません (C3)。")

6. 行や列のデータを一括で取得

特定の行や列に含まれるすべてのセルの値をリストとして取得することも可能です。

# 最初の行のデータを取得 (インデックス0)
try:
    first_row_values = sheet.row_values(rowx=0)
    print(f"1行目のデータ: {first_row_values}")
except IndexError:
    print("エラー: 1行目が存在しません。")


# 2列目のデータを取得 (インデックス1)
try:
    second_col_values = sheet.col_values(colx=1)
    print(f"2列目のデータ: {second_col_values}")
except IndexError:
    print("エラー: 2列目が存在しません。")

7. シート全体のデータを反復処理

シート内のすべての行や列をループ処理して、データを体系的に抽出できます。

# シートの行数と列数を取得
num_rows = sheet.nrows
num_cols = sheet.ncols
print(f"シートの行数: {num_rows}, 列数: {num_cols}")

print("\nシート全体のデータを読み込み:")
# 全ての行をループ
for row_idx in range(num_rows):
    row_data = []
    # 各行の全ての列をループ
    for col_idx in range(num_cols):
        cell_value = sheet.cell_value(rowx=row_idx, colx=col_idx)
        row_data.append(cell_value)
    print(f"行 {row_idx + 1}: {row_data}")

# または、row_values() を使うとより簡潔
print("\nrow_values() を使ってシート全体のデータを読み込み:")
for row_idx in range(num_rows):
    row_data = sheet.row_values(rowx=row_idx)
    print(f"行 {row_idx + 1}: {row_data}")

これらがxlrdを使った基本的な.xlsファイルの読み込み操作です。次のセクションでは、データ型や日付の扱いなど、もう少し詳細な機能について解説します。

主な機能と詳細 ⚙️

xlrdは基本的な読み込み機能に加え、Excelファイルのより詳細な情報にアクセスするための機能も提供しています。ここでは、主要なオブジェクト(Workbook, Sheet, Cell)の属性やメソッド、そして注意が必要なデータ型(特に日付)の扱いについて解説します。

Workbook オブジェクト

xlrd.open_workbook()関数によって返されるオブジェクトで、Excelファイル全体を表します。

  • workbook.nsheets: ワークブック内のシート数を返します (整数)。
  • workbook.sheet_names(): すべてのシート名をリスト形式で返します。
  • workbook.sheet_by_index(sheetx): 指定されたインデックス(0始まり)に対応するSheetオブジェクトを返します。
  • workbook.sheet_by_name(sheet_name): 指定された名前を持つSheetオブジェクトを返します。
  • workbook.datemode: Excelファイルの日付システムのモード(0: 1900年基準、1: 1904年基準)を返します。日付データを正しく扱うために重要です。

Sheet オブジェクト

Workbookオブジェクトから取得される、個々のワークシートを表すオブジェクトです。

  • sheet.name: シートの名前を返します (文字列)。
  • sheet.nrows: シート内の有効な行数を返します (整数)。データが含まれる最後の行までをカウントします。
  • sheet.ncols: シート内の有効な列数を返します (整数)。データが含まれる最後の列までをカウントします。
  • sheet.cell(rowx, colx): 指定された行インデックス(rowx)と列インデックス(colx)にあるCellオブジェクトを返します。
  • sheet.cell_value(rowx, colx): 指定されたセルの「値」を直接返します。データ型はセルの内容に応じてPythonの型(文字列, 数値, 真偽値など)に変換されます。
  • sheet.cell_type(rowx, colx): 指定されたセルの「データ型」を示す整数定数を返します(後述のCellオブジェクトのctypeと同じ)。
  • sheet.row(rowx): 指定された行インデックス(rowx)にあるすべてのCellオブジェクトをリスト形式で返します。
  • sheet.row_values(rowx, start_colx=0, end_colx=None): 指定された行のセルの値をリスト形式で返します。オプションで開始列と終了列を指定できます。
  • sheet.row_types(rowx, start_colx=0, end_colx=None): 指定された行のセルのデータ型(整数定数)をリスト形式で返します。
  • sheet.col(colx): 指定された列インデックス(colx)にあるすべてのCellオブジェクトをリスト形式で返します。
  • sheet.col_values(colx, start_rowx=0, end_rowx=None): 指定された列のセルの値をリスト形式で返します。オプションで開始行と終了行を指定できます。
  • sheet.col_types(colx, start_rowx=0, end_rowx=None): 指定された列のセルのデータ型(整数定数)をリスト形式で返します。

Cell オブジェクト

Sheetオブジェクトから取得される、個々のセルを表すオブジェクトです。

  • cell.value: セルの値を返します。Pythonの対応するデータ型になります(例:文字列はstr、数値はfloat)。
  • cell.ctype: セルのデータ型を示す整数定数を返します。これにより、値がどのような種類のデータかをプログラムで判別できます。主な定数は以下の通りです:
    • xlrd.XL_CELL_EMPTY (0): 空のセル
    • xlrd.XL_CELL_TEXT (1): 文字列 (Unicode)
    • xlrd.XL_CELL_NUMBER (2): 数値 (浮動小数点数)
    • xlrd.XL_CELL_DATE (3): 日付または時刻 (内部的には浮動小数点数として格納)
    • xlrd.XL_CELL_BOOLEAN (4): 真偽値 (True/False)
    • xlrd.XL_CELL_ERROR (5): エラー値 (例: #N/A)
    • xlrd.XL_CELL_BLANK (6): Blankセル (書式情報を持つが値がない場合など)
  • cell.xf_index: セルに適用されている書式情報(XFレコード)へのインデックス。書式情報を利用する場合に使いますが、通常はあまり意識しません。

データ型の判定例

import xlrd

# ... workbook と sheet を開く処理 ...
sheet = workbook.sheet_by_index(0)

row_idx = 1 # 2行目
col_idx = 2 # 3列目 (C列)

try:
    cell = sheet.cell(rowx=row_idx, colx=col_idx)
    cell_type = cell.ctype
    cell_value = cell.value

    print(f"セル({row_idx+1}, {col_idx+1}) の値: {cell_value}")

    if cell_type == xlrd.XL_CELL_TEXT:
        print("データ型: 文字列")
    elif cell_type == xlrd.XL_CELL_NUMBER:
        print("データ型: 数値")
    elif cell_type == xlrd.XL_CELL_DATE:
        print("データ型: 日付")
        # 日付の変換処理は後述
    elif cell_type == xlrd.XL_CELL_BOOLEAN:
        print(f"データ型: 真偽値 ({bool(cell_value)})")
    elif cell_type == xlrd.XL_CELL_EMPTY or cell_type == xlrd.XL_CELL_BLANK:
        print("データ型: 空白")
    elif cell_type == xlrd.XL_CELL_ERROR:
        # エラーコードを人間が読める形式に変換 (オプション)
        error_text = xlrd.error_text_from_code.get(cell_value, "不明なエラー")
        print(f"データ型: エラー ({error_text})")
    else:
        print(f"データ型: 不明 ({cell_type})")

except IndexError:
    print(f"エラー: セル({row_idx+1}, {col_idx+1}) が存在しません。")

日付データの扱い 📅

Excel内部では、日付や時刻は特定の基準日からの経過日数を表すシリアル値(浮動小数点数)として格納されています。xlrdで日付と思われるセル(ctypeXL_CELL_DATE)のvalueを取得すると、このシリアル値が得られます。これをPythonのdatetimeオブジェクトに変換するには、xlrdが提供するxldate_as_datetime()関数を使用します。

この関数には、セルの値(シリアル値)と、ワークブックの日付モード(workbook.datemode)の2つの引数が必要です。日付モードは、基準日が1900年か1904年かを示すもので、Excelファイルによって異なります(通常は1900年基準ですが、古いMac版Excelなどで作成されたファイルは1904年基準の場合があります)。

import xlrd
from datetime import datetime # datetimeモジュールもインポート

# ... workbook と sheet を開く処理 ...
workbook = xlrd.open_workbook('example_with_dates.xls') # 日付データを含むファイルを指定
sheet = workbook.sheet_by_index(0)

row_idx = 1 # 例: 2行目
col_idx = 0 # 例: 1列目 (A列)

try:
    date_cell = sheet.cell(rowx=row_idx, colx=col_idx)

    if date_cell.ctype == xlrd.XL_CELL_DATE:
        try:
            datetime_value = xlrd.xldate_as_datetime(date_cell.value, workbook.datemode)
            print(f"セル({row_idx+1}, {col_idx+1}) の日付データ: {datetime_value}")
            # datetimeオブジェクトとして取得できるので、年、月、日などを個別に取得可能
            print(f"年: {datetime_value.year}, 月: {datetime_value.month}, 日: {datetime_value.day}")
        except ValueError:
            print(f"エラー: セル({row_idx+1}, {col_idx+1}) の日付変換に失敗しました。値: {date_cell.value}")
        except xlrd.XLDateError as e:
            print(f"エラー: 日付モード({workbook.datemode})で無効な日付です。{e}")

    elif date_cell.ctype == xlrd.XL_CELL_NUMBER:
        # 日付として書式設定されているが、数値として認識される場合も考慮
        # 必要であれば、手動で変換を試みることも可能だが、通常はXL_CELL_DATEで判定する
        print(f"セル({row_idx+1}, {col_idx+1}) は数値データです: {date_cell.value}")
    else:
        print(f"セル({row_idx+1}, {col_idx+1}) は日付データではありません: {date_cell.value}")

except IndexError:
    print(f"エラー: セル({row_idx+1}, {col_idx+1}) が存在しません。")

xldate_as_datetime()を使うことで、Excelのシリアル値をPythonで扱いやすいdatetimeオブジェクトに変換できます。

書式情報の取得(限定的)

xlrdは、セルの値だけでなく、限定的ながら書式情報(フォント、背景色、罫線など)にもアクセスする機能を持っています。これを利用するには、open_workbook()関数を呼び出す際にformatting_info=Trueという引数を追加します。

# 書式情報を有効にしてワークブックを開く
workbook = xlrd.open_workbook('example.xls', formatting_info=True)

ただし、書式情報の構造は複雑であり、xlrdで取得できる情報も完全ではありません。また、この機能を使うとメモリ使用量が増加し、処理速度も低下する可能性があります。現代的なライブラリ(特にopenpyxl)は、書式設定の読み書きに関してより高機能で扱いやすいため、もし書式情報が必要な場合は、そちらの利用を検討する方が良いでしょう。xlrdでの書式情報の利用は、非常に特殊なケースに限られると考えられます。

🚨 重要:xlrdの制限事項 (.xlsx 非対応)

これまで何度か触れてきましたが、xlrdライブラリを現在利用する上で最も重要な注意点は、新しいExcel形式である.xlsxファイルを読み込めないことです。これは意図的な変更であり、ライブラリの仕様です。

  • 変更バージョン: xlrd バージョン 2.0.0 (2020年12月11日リリース) 以降
  • 変更内容: .xls 形式以外のファイル(主に .xlsx)のサポートを完全に削除
  • 理由: .xlsxファイルは実質的にXMLファイルを含むZIPアーカイブであり、そのXML解析に関連する潜在的なセキュリティ脆弱性(XML爆弾など)への対応が困難であったため。開発者は、.xlsx対応についてはopenpyxlのような専門ライブラリに任せるという判断をしました。

この変更により、最新のxlrd (バージョン 2.0.0 以降) をインストールして.xlsxファイルをxlrd.open_workbook()で開こうとすると、以下のようなエラーが発生します。

xlrd.biffh.XLRDError: Excel xlsx file; not supported

現在インストールされているxlrdのバージョンは、コマンドラインで以下のコマンドを実行することで確認できます。

pip show xlrd

出力の中に `Version: 2.x.x` のように表示されれば、.xlsx非対応のバージョンです。

古いバージョン(1.2.0など)をインストールすれば.xlsxを読み込めるのでは?

技術的には可能です(例: pip install xlrd==1.2.0)。しかし、以下の理由から強く非推奨です。

  1. セキュリティリスク: サポートが終了した古いバージョンには、未修正の脆弱性が存在する可能性があります。
  2. メンテナンスの欠如: 古いバージョンはバグ修正や機能改善が行われません。
  3. 互換性の問題: 他のライブラリ(特にpandasなど)が新しいxlrdを前提としている場合、予期せぬ問題が発生する可能性があります。
  4. 優れた代替手段の存在: .xlsxファイルを安全かつ高機能に扱える優れた代替ライブラリ(openpyxl, pandas)が存在します。

したがって、特別な理由がない限り、.xlsxファイルを扱う目的で古いxlrdをインストールするべきではありません。 .xlsxファイルを扱う必要がある場合は、次にご紹介する代替ライブラリの使用を検討してください。xlrdは、あくまで.xls形式のレガシーファイルを読むためのライブラリと位置づけるのが現在の正しい認識です。

xlrdの代替ライブラリ:現代的なExcel操作のために 🚀

xlrd.xlsx形式のサポートを終了した現在、モダンなExcelファイル(.xlsx, .xlsm, .xlsbなど)をPythonで扱うためには、他のライブラリを利用する必要があります。幸い、非常に強力で活発に開発されている代替ライブラリがいくつか存在します。

1. openpyxl

.xlsx / .xlsm / .xltx / .xltm 形式の読み書きにおいて、現在最も標準的かつ推奨されるライブラリです。xlrdとは異なり、書き込み機能も非常に充実しています。

  • 主な特徴:
    • .xlsx形式ファイルの読み込みと書き込みに対応。
    • セルの値だけでなく、書式設定(フォント、色、罫線、数値形式など)の読み書きが可能。
    • 数式の読み書き(計算結果ではなく数式自体)。
    • グラフや画像の挿入・操作(限定的)。
    • シートの操作(追加、削除、コピーなど)。
    • 活発にメンテナンスされており、機能追加やバグ修正が継続的に行われている。
  • インストール:
    pip install openpyxl
  • 簡単な使用例 (読み込み):
    import openpyxl
    
    # .xlsx ファイルを開く
    try:
        workbook = openpyxl.load_workbook('example.xlsx')
        sheet = workbook.active # アクティブなシートを取得
    
        # セルA1の値を取得
        cell_a1 = sheet['A1'].value
        print(f"セルA1の値: {cell_a1}")
    
        # 行ごとに反復処理
        for row in sheet.iter_rows(min_row=1, max_col=sheet.max_column, values_only=True):
            print(row)
    
    except FileNotFoundError:
        print("エラー: ファイルが見つかりません。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")
    
  • PyPIページ: https://pypi.org/project/openpyxl/

.xlsxファイルを扱うほとんどのケースで、openpyxlが第一候補となるでしょう。

2. pandas

Pythonでデータ分析を行う際のデファクトスタンダードとも言えるライブラリです。pandasは直接Excelファイルを操作するわけではありませんが、read_excel()関数を通じてExcelファイルのデータを効率的にDataFrameオブジェクト(高機能な表形式データ構造)に読み込むことができます。

  • 主な特徴:
    • read_excel()関数で.xlsおよび.xlsx形式のファイルを簡単に読み込める。
    • 内部的にxlrd.xls用)やopenpyxl.xlsx用)などのエンジンを選択して利用する。
    • 読み込んだデータをDataFrameとして扱えるため、データのクリーニング、変換、集計、分析などの操作が非常に容易。
    • to_excel()関数でDataFrameをExcelファイル(.xlsx)に書き出すことも可能。
    • 大規模なデータの扱いや複雑なデータ操作に強い。
  • インストール (通常、データサイエンス系の環境にはプリインストールされています):
    pip install pandas openpyxl # .xlsxを扱うためにopenpyxlも必要

    (もし古い.xlsファイルをpandasで読み込みたい場合は、xlrdも必要になります: pip install pandas openpyxl xlrd

  • 簡単な使用例 (読み込み):
    import pandas as pd
    
    try:
        # .xlsx ファイルを読み込む (engine='openpyxl' が自動選択されることが多い)
        df_xlsx = pd.read_excel('example.xlsx', sheet_name='Sheet1') # シート名も指定可能
        print("--- .xlsx ファイルの読み込み結果 (最初の5行) ---")
        print(df_xlsx.head())
    
        # .xls ファイルを読み込む (engine='xlrd' が必要)
        # df_xls = pd.read_excel('example.xls', engine='xlrd')
        # print("\n--- .xls ファイルの読み込み結果 (最初の5行) ---")
        # print(df_xls.head())
    
    except FileNotFoundError:
        print("エラー: ファイルが見つかりません。")
    except ImportError as e:
        print(f"エラー: 必要なライブラリがインストールされていません。{e}")
        print("`pip install pandas openpyxl xlrd` を試してください。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")
    
  • 公式ドキュメント (read_excel): https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.read_excel.html

Excelデータを読み込んでデータ分析や加工を行いたい場合は、pandasが非常に強力な選択肢となります。

3. その他のライブラリ

  • xlsxwriter: .xlsxファイルの書き込み専用ライブラリ。特にグラフ作成機能や高度な書式設定機能が充実しています。読み込みはできません。
  • pyxlsb: Excelバイナリ形式 (.xlsb) ファイルの読み込みに対応したライブラリ。.xlsb.xlsxよりもファイルサイズが小さく、読み書きが高速な場合がありますが、一般的ではありません。
  • xlwt: xlrdと対になるライブラリで、古い.xls形式ファイルの書き込み専用ライブラリ。現在はopenpyxlxlsxwriterの利用が推奨されるため、新規開発での利用は稀です。
  • xlutils: xlrdxlwtを組み合わせて、既存の.xlsファイルを変更(コピーして変更)する機能を提供します。これもopenpyxlで代替可能です。

ライブラリ比較表

主要なライブラリの特徴をまとめます。

ライブラリ 対応形式 (主) 主な用途 読み込み 書き込み 書式/グラフ 備考
xlrd .xls (Excel 97-2003) 古い.xlsファイルのデータ読み取り △ (限定的) .xlsx 非対応 (v2.0.0+)
openpyxl .xlsx, .xlsm モダンなExcelファイルの読み書き、操作全般 ✅ (充実) .xlsx系の標準ライブラリ
pandas .xls, .xlsx, 他多数 データ分析のためのExcelデータ読み込み/書き出し ✅ (内部エンジン利用) ✅ (DataFrameから) △ (書き込み時一部) データ分析に最適
xlsxwriter .xlsx モダンなExcelファイルの書き込み、特にグラフ作成 ✅ (高機能) 書き込み専用
xlwt .xls 古い.xlsファイルの書き込み 書き込み専用、旧形式用

目的に応じて適切なライブラリを選択することが重要です。多くの場合、.xlsxファイルを扱うならopenpyxlデータ分析が主目的ならpandas、そしてレガシーな.xlsファイルを読む必要がある場合に限りxlrdという使い分けになるでしょう。

xlrdを使うべきケースとは? 🤔

これまで解説してきたように、xlrdには.xlsx非対応という大きな制限事項があり、多くの代替ライブラリが存在します。では、現代においてxlrdを積極的に使うべき場面はあるのでしょうか?

結論から言うと、新規のプロジェクトや、モダンなExcelファイルを扱うことが想定される場合には、xlrdを選択する理由はほとんどありません。 openpyxlpandasの方が高機能で、メンテナンスもされており、セキュリティ面でも安心です。

しかし、以下のような特定の状況下では、xlrdの利用が依然として適切、あるいは必要となる可能性があります。

  1. 完全に .xls 形式のファイルしか扱わないことが保証されている場合:
    システムの制約などにより、処理対象となるExcelファイルが確実に古い.xls形式(Excel 97-2003)のみである、と断言できる状況です。例えば、非常に古いシステムから出力される帳票データで、今後も形式が変更される予定がない場合などが考えられます。この場合、xlrd.xls形式を読むことに特化しているため、シンプルで軽量な選択肢となりえます。
  2. 既存のコードベースが xlrd に大きく依存している場合:
    過去にxlrd (.xlsx対応時代の古いバージョンを含む) を使って構築されたシステムやツールがあり、その改修コストが大きい場合。ただし、この場合でも、対象ファイルに.xlsxが含まれるのであれば、セキュリティリスクや将来的なメンテナンス性を考慮し、openpyxlpandasへの移行を検討することが強く推奨されます。.xlsファイルのみを扱っている場合でも、依存ライブラリは最新の状態に保つことが望ましいです。
  3. pandas.xls ファイルを読み込む必要がある場合:
    データ分析ライブラリpandasread_excel()関数は、.xlsファイルを読み込む際に内部的にxlrdをエンジンとして使用します。したがって、pandasを使って.xls形式のデータを分析したい場合には、xlrdライブラリがインストールされている必要があります。(ただし、この場合でもxlrdを直接コード上で呼び出すわけではありません)。

上記以外のケース、特にこれから新しくPythonでExcelファイルを扱うコードを書く場合や、.xlsx形式のファイルを扱う可能性がある場合は、xlrdではなくopenpyxlpandasを使用することを強くお勧めします。

xlrdは歴史的に重要なライブラリでしたが、その役割は主にレガシーな.xlsファイルの読み取りへと変化しています。この点を理解し、プロジェクトの要件に合わせて適切なツールを選択することが重要です。

まとめ ✨

このブログでは、Pythonライブラリxlrdについて詳しく解説しました。最後に、重要なポイントをまとめます。

  • xlrdは、古い形式のExcelファイル(.xls、Excel 97-2003)からデータを読み取るためのPythonライブラリです。
  • インストールはpip install xlrdで簡単に行えます。
  • 基本的な使い方は、xlrd.open_workbook()でファイルを開き、sheet_by_index()sheet_by_name()でシートを取得し、cell_value()row_values()などでデータを読み取ります。
  • 日付データはExcel内部ではシリアル値として格納されており、xlrd.xldate_as_datetime()関数とworkbook.datemodeを使ってPythonのdatetimeオブジェクトに変換できます。
  • 🚨 最大の注意点:xlrdバージョン2.0.0(2020年12月リリース)以降は、.xlsx形式ファイルのサポートを完全に終了しています。 これはセキュリティ上の理由による意図的な変更です。
  • 最新のxlrd.xlsxファイルを開こうとするとxlrd.biffh.XLRDError: Excel xlsx file; not supportedエラーが発生します。
  • モダンな.xlsxファイルを扱う場合は、xlrdの代替として以下のライブラリが推奨されます:
    • openpyxl: .xlsxファイルの読み書き、書式設定など、総合的な操作に対応する標準的なライブラリ。
    • pandas: データ分析目的でExcelファイル(.xls, .xlsx)を読み書きする際に非常に強力。内部でxlrdopenpyxlを使用。
    • xlsxwriter: .xlsxファイルの書き込み専用ライブラリ。グラフ作成などが得意。
  • xlrdを現在使うべきケースは、主にレガシーな.xlsファイルのみを確実に扱う必要がある場合に限られます。

xlrdはPythonでExcelファイルを扱うための先駆的なライブラリの一つでしたが、Excel形式の変化とセキュリティへの配慮から、その役割は変化しました。.xlsファイルを扱う際には依然として有効ですが、.xlsxファイルを扱う際にはopenpyxlpandasといった、より現代的で高機能なライブラリを選択することが重要です。

この解説が、PythonでのExcelファイル操作におけるライブラリ選択の一助となれば幸いです。😊

コメント

タイトルとURLをコピーしました