【Python】ファイル名からExcelブックを取得する|openpyxl or win32com
作成日:2025-10-04
更新日:2025-10-04

openpyxl
|ディレクトリ内のファイルを部分一致で探す

Search する
# Get workbook by (partial) name|部分一致でブックを取得
# 見つからなければ None を返す
import os
from openpyxl import load_workbook
def get_book_by_name(directory: str, name_part: str):
"""
Search for an Excel file in a directory whose filename contains name_part.
ディレクトリ内のExcelファイルから部分一致で検索し、Workbookを返す。
"""
for fname in os.listdir(directory):
if name_part.lower() in fname.lower() and fname.endswith((".xlsx", ".xlsm")):
path = os.path.join(directory, fname)
return load_workbook(path)
return None
# 呼び出し例
wb = get_book_by_name("/path/to/excel/files", "Sample")
if wb is None:
print("対象ブックが見つかりません。")
else:
print("見つかった:", wb.properties.title or "No title")
注意点
openpyxl
では、既に開いているExcelのブックは取れない

開いているブックから探すなら、別の方法で
win32com|今開いているブックの中から探す(COM経由)

Scan する
# Get workbook by (partial) name from open Excel|開いているExcelから部分一致でWorkbookを取得
import win32com.client
def get_book_by_name(name_part: str):
"""
Search among currently open Excel workbooks for one containing name_part in its name.
今開いているExcelのブックの中から部分一致で検索し、Workbookを返す。
"""
excel = win32com.client.GetObject(Class="Excel.Application")
for wb in excel.Workbooks:
if name_part.lower() in wb.Name.lower():
return wb
return None
# 呼び出し例
book = get_book_by_name("Sample")
if book is None:
print("対象ブックが見つかりません。")
else:
print("見つかった:", book.Name)
pywin32 (win32com.client)
COM経由でExcelアプリケーションに接続する
注意点
- Windows限定(macOSはAppleScriptやAppScript経由になる)。
- PythonからExcelを制御するので、Excelが起動中であることが前提。
substring.lower() in string.lower()
文字が含まれているかを判定する
補足|Search と Scan の違い
- Search|検索 = 「条件に合うものを見つける行為」
- Scan|走査 = 「すべての要素を順にチェックする行為」
- Search = 意図的/効率的, Scan = 網羅的/逐次的 のニュアンスがある
- Search means looking inside a known space for matches, Scan means mechanically walking through everything.
- Search is focused and intentional, Scan is exhaustive and sequential.
- Searchは範囲内から一致を探す、Scanは機械的に全件を探す
- Searchは焦点を絞った意図的行為、Scanは網羅的で逐次的な行為
Search|検索
- 例: 「名前に
Sample
を含むWorkbookを探す」 - 対象は限定的 → Workbooksコレクション、特定フォルダなど
- 内部的には
in
やInStr
で判定することが多い - ユーザー視点では「探して見つける」行為
Scan|走査
- 例: 「フォルダ内のすべてのファイルを逐次読み取る」
- 網羅的に全件確認 → 効率性は低い場合が多い
- アルゴリズム用語では「linear scan(線形走査)」とも言う
- ユーザー視点では「一つ一つ全部見ていく」行為
VBA / Pythonでの対比
- VBA
For Each wb In Workbooks
→ Search(対象はすでにExcelに開かれているブックに限定) - Pythonで
os.listdir(directory)
してfor f in files
→ Scan(フォルダ内のすべてのファイルを舐めてから条件判定)
日常例でイメージ
- Search|検索: 図書館の検索端末で「夏目漱石」と入力して、蔵書からすぐに絞り込む
- Scan|走査: 本棚を最初から最後まで順番に見て「夏目漱石」を探す
- Search for files, not “open workbooks.”
- Control Excel via COM, not by scanning files.
- Keep logic pure, let caller handle messages.
- “開いているブック”ではなく“ファイル検索(search)”で考える
- ファイル検索(scan)ではなく、COM経由でExcelを操作する
- ロジックは純粋に、メッセージは呼び出し側で扱う
Referenced Insights
- openpyxl documentation: https://openpyxl.readthedocs.io/en/stable/
- pywin32 documentation: https://github.com/mhammond/pywin32
Vocabulary
| pywin32|pywin32ライブラリ |
| COM Automation|COM自動化 |
| Workbook Collection|Workbookコレクション |
| Case-insensitive Search|大文字小文字を無視した検索 |
| Responsibility Separation|責務分離 |
| Search|検索 |
| Scan|走査 |
| Linear Scan|線形走査 |
| Targeted Lookup|対象を絞った検索 |
| Efficiency|効率性 |
2025-10-04
編集後記:
この記事の内容がベストではないかもしれません。
記事一覧
-
[Python]Stringsplit 【Python】文字列を抜き出す|split -
[Python]pathlib存在確認 【Python】フォルダとファイルの存在確認|pathlib -
[Python]Excel datapandas.DataFrame 【Python】シートにあるデータを配列に格納する|pandas.DataFrame -
[Python]endswith+ lower 【Python】拡張子の存在確認|endswith + lower(Method Chaining) -
[Python]Write a 1D arrayvia pandas 【Python】Excelに書き出す|pandas.ExcelWriter -
[Python]inString 【Python】指定の文字列が含まれているか|in