「エンジンを指定する」とは何をしているのか
pandas.read_excel 自体は「Excelを読む関数」ですが、
実際に .xlsx や .xls の中身を開いて解析しているのは、openpyxl や xlrd といった「専用ライブラリ(エンジン)」です。
engine='openpyxl' のように書くのは、
「このファイルは、このライブラリを使って読んでね」と pandas に明示する、ということです。
特に最近は、.xlsx は openpyxl、古い .xls は xlrd(ただし制限あり)という住み分けになっているので、
「どの拡張子に、どのエンジンが向いているか」をざっくり理解しておくとトラブルが減ります。
基本形: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 をサポートしません」
古い記事やサンプルコードでは、.xlsx を xlrd で読んでいた時代のものが残っています。
しかし、現在の xlrd は .xlsx をサポートしていません。
例えば、こんなエラーが出ることがあります。
xlrd.biffh.XLRDError: Excel xlsx file; not supported
この場合は、コード側でエンジンを openpyxl に切り替える必要があります。
df = pd.read_excel("data.xlsx", engine="openpyxl")
Python「.xlsx は openpyxl」と覚えておくと、この手のエラーにすぐ対応できます。
拡張子とエンジンのざっくり対応関係
.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())
Pythonsheet_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” 付きと無しで読み、結果を比べる
条件は次の通りです。
df1 = pd.read_excel("sales.xlsx")df2 = pd.read_excel("sales.xlsx", engine="openpyxl")- それぞれ
df.head()とdf.dtypesを表示してみる
自分の環境で「どちらも動くか」「どちらかがエラーになるか」を確認してみてください。
練習2:古い old_data.xls を engine=”xlrd” で読み、.xlsx に変換する
条件は次の通りです。
engine="xlrd"を指定して.xlsを読むto_excel("converted.xlsx", index=False)で書き出す- その
.xlsxをengine="openpyxl"で読み直してみる
ここまでやると、「エンジンの違い」と「拡張子の違い」の関係がかなりクリアになります。
最後に
engine='openpyxl' は、
「このExcelを、どの“中身を読む道具”で開くか」を指定するためのスイッチです。
特に .xlsx と .xls が混在している現場では、
.xlsx → openpyxl
古い .xls → 可能なら .xlsx に変換してから openpyxl
という方針を持っておくと、エラーと戦う時間がかなり減ります。
「このファイルはどの時代の形式か?」
「それに合うエンジンはどれか?」
一度そこを意識してから read_excel のコードを書く癖をつけると、Excelとの付き合い方が一段スムーズになります。
