PythonでExcelのエンジンを指定する入門 — engine=’openpyxl’ / ‘xlrd’
Excelの拡張子や環境によって、pandasが使う「読み書きの裏方(エンジン)」が変わります。確実に動かすための基本と、初心者向けの実用コードをまとめました。
何を使うべきか(拡張子で決める)
- .xlsx / .xlsm / .xltx(新しいExcel形式):
推奨エンジン: openpyxl- インストール:
pip install openpyxl
- インストール:
- .xls(古いExcel形式):
推奨エンジン: xlrd(読み込み専用)- インストール:
pip install xlrd
- インストール:
- 注意点: xlrd は現在 .xlsx を読みません(2.x以降)。.xlsx は openpyxl を使いましょう。
読み込みでのエンジン指定
import pandas as pd
# .xlsx を openpyxl で読む(明示指定)
df = pd.read_excel("data.xlsx", engine="openpyxl")
# .xls を xlrd で読む(明示指定)
df = pd.read_excel("legacy.xls", engine="xlrd")
print(df.head())
Python- ポイント: たいていは拡張子で自動判定されますが、環境によっては明示指定すると安定します。
よくある組み合わせとテンプレート
.xlsx 帳票を読み込む(列選択や日付パースも同時に)
import pandas as pd
df = pd.read_excel(
"report.xlsx",
engine="openpyxl",
usecols=["Date", "Product", "Amount"],
parse_dates=["Date"]
)
df["Amount"] = pd.to_numeric(df["Amount"], errors="coerce")
print(df.info())
Python.xls を読み込む(古い帳票対応)
import pandas as pd
df = pd.read_excel(
"legacy_report.xls",
engine="xlrd",
skiprows=5,
header=0,
usecols="A:D"
)
print(df.head())
Python説明行あり+日本語列名の整形
import pandas as pd
df = pd.read_excel(
"monthly.xlsx",
engine="openpyxl",
skiprows=6,
header=0,
usecols="B:G"
)
df = df.rename(columns=lambda c: str(c).strip())
print(df.columns)
Python書き込み(保存)でのエンジン指定
DataFrame を .xlsx に書き出す(openpyxl)
import pandas as pd
df = pd.DataFrame({"Date": pd.date_range("2025-01-01", periods=3), "Revenue": [100, 200, 150]})
with pd.ExcelWriter("out.xlsx", engine="openpyxl") as writer:
df.to_excel(writer, sheet_name="Summary", index=False)
Python- ポイント:
ExcelWriterのengine="openpyxl"を使うと .xlsx に安全に保存できます。
トラブルシュートと回避策
- .xlsx が読めない(ImportError など)
- 原因: openpyxl 未インストール。
- 対策:
pip install openpyxl。明示的にengine="openpyxl"を指定。
- .xls が読めない
- 原因: xlrd 未インストール、またはファイルが実は .xlsx。
- 対策:
pip install xlrd。拡張子と実ファイル形式を再確認。
- xlrd で .xlsx を読もうとして失敗
- 原因: xlrd は .xlsx 非対応。
- 対策: openpyxl を使う(
engine="openpyxl")。
- 速度が遅い
- 対策: 読み込み時に
usecols、skiprows、nrowsで絞る。不要なシートは読まない(sheet_name=で限定)。
- 対策: 読み込み時に
ミニ例題(練習用)
- 例題1: .xlsx を openpyxl 指定で読み、先頭10行表示
import pandas as pd
df = pd.read_excel("sales.xlsx", engine="openpyxl")
print(df.head(10))
Python- 例題2: .xls を xlrd 指定で読み、列範囲を A:D に限定
import pandas as pd
df = pd.read_excel("legacy.xls", engine="xlrd", usecols="A:D")
print(df.head())
Python- 例題3: 書き込み:日付入りデータを .xlsx に保存
import pandas as pd
df = pd.DataFrame({"date": pd.date_range("2025-01-01", periods=5), "amount": [10,20,30,40,50]})
with pd.ExcelWriter("result.xlsx", engine="openpyxl") as w:
df.to_excel(w, sheet_name="Data", index=False)
Pythonまとめ
- .xlsx 系は openpyxl、.xls は xlrd。 これが基本の使い分け。
- 読み込み・書き込みで明示指定すると安定。
engine="openpyxl"/engine="xlrd"。 - 失敗したら拡張子とインストールを確認。 必要なパッケージを入れ、列と行を絞って効率的に処理。
