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

Python
スポンサーリンク

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
  • ポイント: ExcelWriterengine="openpyxl" を使うと .xlsx に安全に保存できます。

トラブルシュートと回避策

  • .xlsx が読めない(ImportError など)
    • 原因: openpyxl 未インストール。
    • 対策: pip install openpyxl。明示的に engine="openpyxl" を指定。
  • .xls が読めない
    • 原因: xlrd 未インストール、またはファイルが実は .xlsx。
    • 対策: pip install xlrd。拡張子と実ファイル形式を再確認。
  • xlrd で .xlsx を読もうとして失敗
    • 原因: xlrd は .xlsx 非対応。
    • 対策: openpyxl を使う(engine="openpyxl")。
  • 速度が遅い
    • 対策: 読み込み時に usecolsskiprowsnrows で絞る。不要なシートは読まない(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"
  • 失敗したら拡張子とインストールを確認。 必要なパッケージを入れ、列と行を絞って効率的に処理。

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