Python Excel操作 逆引き集 | エンジン指定(openpyxl/xlrd)

Python Python
スポンサーリンク

「エンジンを指定する」とは何をしているのか

pandas.read_excel 自体は「Excelを読む関数」ですが、
実際に .xlsx.xls の中身を開いて解析しているのは、
openpyxlxlrd といった「専用ライブラリ(エンジン)」です。

engine='openpyxl' のように書くのは、
「このファイルは、このライブラリを使って読んでね」と pandas に明示する、ということです。

特に最近は、.xlsxopenpyxl、古い .xlsxlrd(ただし制限あり)という住み分けになっているので、
「どの拡張子に、どのエンジンが向いているか」をざっくり理解しておくとトラブルが減ります。


基本形:engine=’openpyxl’ を付けた読み込み

一番シンプルな書き方

import pandas as pd

df = pd.read_excel(
    "data.xlsx",
    engine="openpyxl"
)

print(df.head())
Python

.xlsx ファイルを読むとき、最近の pandas では多くの場合 engine を省略しても自動で openpyxl が選ばれます。
ただし、環境によっては「エンジンが見つからない」「xlrdでは読めない」などのエラーになることがあるので、
そういうときに「明示的に engine="openpyxl" を指定する」と覚えておくと安心です。


なぜ engine を意識した方がいいのか

よくあるエラー:「xlrd は .xlsx をサポートしません」

古い記事やサンプルコードでは、.xlsxxlrd で読んでいた時代のものが残っています。
しかし、現在の xlrd.xlsx をサポートしていません。

例えば、こんなエラーが出ることがあります。

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

この場合は、コード側でエンジンを openpyxl に切り替える必要があります。

df = pd.read_excel("data.xlsx", engine="openpyxl")
Python

.xlsxopenpyxl」と覚えておくと、この手のエラーにすぐ対応できます。


拡張子とエンジンのざっくり対応関係

.xlsx(新しいExcel形式)の場合

.xlsx は基本的に openpyxl で読みます。

df = pd.read_excel("file.xlsx", engine="openpyxl")
Python

最近の pandas では、engine を省略しても内部で openpyxl が選ばれることが多いですが、
環境によっては openpyxl がインストールされていないとエラーになります。

その場合は、まず openpyxl をインストールし(pip などで)、
コード側で engine="openpyxl" を明示しておくとよいです。

.xls(古いExcel形式)の場合

古い .xls 形式は、かつては xlrd で読むのが一般的でした。
しかし、現在の xlrd.xls 以外をサポートしない・インストール状況によっては使えない、など制約が増えています。

df = pd.read_excel("old_file.xls", engine="xlrd")
Python

ただし、実務では「そもそも .xls.xlsx に保存し直してから扱う」方が安全なことが多いです。
.xls を無理に直接読むより、「一度Excelで開いて .xlsx として保存 → openpyxl で読む」という流れも選択肢として覚えておいてください。


engine 指定と他の引数の組み合わせ

ふつうの read_excel に engine を足すだけ

engine は、他の引数(sheet_name, usecols, dtype, parse_dates など)と一緒に、ただ一つ追加するだけです。

import pandas as pd

df = pd.read_excel(
    "sales.xlsx",
    engine="openpyxl",
    sheet_name="2025-01",
    usecols=["日付", "商品", "数量", "金額"],
    parse_dates=["日付"],
    dtype={"商品": "string"}
)

print(df.head())
print(df.dtypes)
Python

ここで engine="openpyxl" は、「このファイルを開くときにどのライブラリを使うか」を決めているだけで、
DataFrame の中身の扱い方(列の選択・型指定など)には影響しません。

複数シートを辞書で読む場合も同じ

import pandas as pd

dfs = pd.read_excel(
    "book.xlsx",
    sheet_name=None,
    engine="openpyxl"
)

print(dfs.keys())
Python

sheet_name=None で辞書として読む場合も、engine の指定方法はまったく同じです。
「どのエンジンでブックを開くか」を決めてから、その中のシートをどう扱うか、という順番で考えます。


実践テンプレート

テンプレ1:.xlsx を openpyxl で読み、日付と金額を整えて集計

import pandas as pd

df = pd.read_excel(
    "sales_2025.xlsx",
    engine="openpyxl",
    sheet_name="2025-01",
    usecols=["日付", "金額"],
    parse_dates=["日付"]
)

df["金額"] = pd.to_numeric(df["金額"], errors="coerce")

monthly = (
    df.assign(month=df["日付"].dt.to_period("M"))
      .groupby("month", as_index=False)["金額"].sum()
)

print(monthly)
Python

このテンプレートは、「.xlsx を確実に openpyxl で読みたい」場合の基本形です。
engine 以外は、これまで学んできた usecols, parse_dates, 型変換などと同じです。

テンプレ2:古い .xls を一時的に xlrd で読み、すぐに .xlsx に書き出す

import pandas as pd

df = pd.read_excel(
    "old_data.xls",
    engine="xlrd"
)

df.to_excel("old_data_converted.xlsx", index=False)
Python

このテンプレートは、「古い .xls を一度だけ読み、以降は .xlsx として扱う」ためのものです。
現場に古いファイルが残っている場合、「変換してしまう」という戦略も覚えておくと楽になります。


つまずきやすいポイントと注意点

engine を指定してもライブラリが入っていないと動かない

engine="openpyxl" と書いても、環境に openpyxl がインストールされていなければエラーになります。
その場合は、まずライブラリをインストールする必要があります。

コード側でできることは、「どのエンジンを使うかを指定する」までで、
そのエンジン自体のインストールは別の話、という点を押さえておいてください。

engine を省略しても動く環境と、動かない環境がある

ローカルの環境では engine を省略しても動くのに、
別のPCやサーバーではエラーになる、ということがあります。

そういう「環境差」を減らしたいときに、
あえて engine="openpyxl" を明示しておく、というのは立派な設計判断です。


小さな練習問題

練習1:sales.xlsx を engine=”openpyxl” 付きと無しで読み、結果を比べる

条件は次の通りです。

  1. df1 = pd.read_excel("sales.xlsx")
  2. df2 = pd.read_excel("sales.xlsx", engine="openpyxl")
  3. それぞれ df.head()df.dtypes を表示してみる

自分の環境で「どちらも動くか」「どちらかがエラーになるか」を確認してみてください。

練習2:古い old_data.xls を engine=”xlrd” で読み、.xlsx に変換する

条件は次の通りです。

  1. engine="xlrd" を指定して .xls を読む
  2. to_excel("converted.xlsx", index=False) で書き出す
  3. その .xlsxengine="openpyxl" で読み直してみる

ここまでやると、「エンジンの違い」と「拡張子の違い」の関係がかなりクリアになります。


最後に

engine='openpyxl' は、
「このExcelを、どの“中身を読む道具”で開くか」を指定するためのスイッチです。

特に .xlsx.xls が混在している現場では、

.xlsxopenpyxl
古い .xls → 可能なら .xlsx に変換してから openpyxl

という方針を持っておくと、エラーと戦う時間がかなり減ります。

「このファイルはどの時代の形式か?」
「それに合うエンジンはどれか?」
一度そこを意識してから read_excel のコードを書く癖をつけると、Excelとの付き合い方が一段スムーズになります。

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