銀河鉄道

【Python】ファイル名からExcelブックを取得する|openpyxl or win32com

サムネイル
[Python]Search or Scanfor Excel book

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アプリケーションに接続する

注意点

  1. Windows限定(macOSはAppleScriptやAppScript経由になる)。
  2. 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コレクション、特定フォルダなど
  • 内部的には inInStr で判定することが多い
  • ユーザー視点では「探して見つける」行為

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

Vocabulary

| pywin32|pywin32ライブラリ |
| COM Automation|COM自動化 |
| Workbook Collection|Workbookコレクション |
| Case-insensitive Search|大文字小文字を無視した検索 |
| Responsibility Separation|責務分離 |
| Search|検索 |
| Scan|走査 |
| Linear Scan|線形走査 |
| Targeted Lookup|対象を絞った検索 |
| Efficiency|効率性 |

著者

author
月うさぎ

編集後記:
この記事の内容がベストではないかもしれません。

記事一覧