はじめに
こんにちは、ニンジンです。 第1回では、PythonでExcelの中身を読み取るところまで成功しました。しかし、前回のプログラムには大きな弱点がありました。それは**「プログラムと同じ場所にExcelを置かないと動かない」**ということです。
実際の業務では、デスクトップや共有フォルダなど、Excelの場所は様々ですよね。今回は、Windowsでおなじみの「ファイルを開く」画面を実装し、さらに「前回開いた場所を覚えさせる」というプロ仕様の工夫を加えていきます。
■ ステップ②:tkinterでファイル選択!自由な場所のExcelを選べるようにする
まずは、ローカルの任意のフォルダからファイルを選べるようにしましょう。
ここで登場するのが、Python標準のGUIライブラリtkinterの中にある**filedialog**です。
サンプルコード(mail-soft-test02.py)はこちらをクリック
import pandas as pd
from tkinter import filedialog
import tkinter as tk
import os
def select_and_load_excel():
# 1. 小さなメインウィンドウが裏で出ないように隠す
root = tk.Tk()
root.withdraw()
# 2. ファイル選択ダイアログを表示
# filetypesでExcelファイル(.xlsx)だけを表示するように制限
file_path = filedialog.askopenfilename(
title="Excelファイルを選択してください",
filetypes=[("Excel files", "*.xlsx"), ("All files", "*.*")]
)
# 3. ファイルが選択されたかチェック
if not file_path:
print("ファイルが選択されませんでした。")
return
print(f"選択されたファイル: {file_path}")
# 4. Excelを読み込んで表示
try:
df = pd.read_excel(file_path)
# 1行ずつデータを取り出す
for index, row in df.iterrows():
name = row['氏名']
email = row['アドレス']
company = row['会社名']
print(f"データ取得成功: {company} / {name} 様 ({email})")
except Exception as e:
print(f"エラーが発生しました: {e}")
# 実行
if __name__ == "__main__":
select_and_load_excel()
※VSCodeなどのエディターにてサンプルコードを実行して下さい
ここがポイント!
root.withdraw():tkinterは本来ウィンドウを作るためのものなので、これがないと空の小さな窓が勝手に出てきてしまいます。それを「隠す」ためのおまじないです。filetypesの指定: 画像や音楽ファイルを選べないように制限することで、予期せぬエラーを未然に防ぎます。
■ ステップ③:選んだフォルダを記憶させる(config.json)
何度もステップ②を実行すると感じるのですが、毎回「デスクトップの……あのフォルダの……」と探しに行くのは面倒ですよね。 そこで、**「前回選んだ場所を覚えさせて、次からはそこをパッと開く」**機能を実装します。
これには、軽量で扱いやすいJSON形式の設定ファイルを使います。
仕組みのイメージ
- 起動時:
config.jsonがあるか確認し、あれば前回使ったフォルダパスを読み込む。 - ファイル選択時: 読み込んだパスを「初期フォルダ」として開く。
- 選択後: 新しく選んだ場所を
config.jsonに上書き保存する。
サンプルコード(mail-soft-test03.py)はこちらをクリック
import pandas as pd
from tkinter import filedialog
import tkinter as tk
import os
import json
# 設定ファイルの保存名
CONFIG_FILE = "config.json"
def load_last_path():
"""前回使用したフォルダパスを読み込む"""
if os.path.exists(CONFIG_FILE):
with open(CONFIG_FILE, "r", encoding="utf-8") as f:
config = json.load(f)
return config.get("last_path", os.path.expanduser("~")) # なければホームディレクトリ
return os.path.expanduser("~")
def save_last_path(file_path):
"""選択されたフォルダパスを保存する"""
folder_path = os.path.dirname(file_path)
with open(CONFIG_FILE, "w", encoding="utf-8") as f:
json.dump({"last_path": folder_path}, f, ensure_ascii=False, indent=4)
def select_and_load_excel():
root = tk.Tk()
root.withdraw()
# 前回のパスを取得
initial_dir = load_last_path()
file_path = filedialog.askopenfilename(
title="Excelファイルを選択してください",
initialdir=initial_dir, # ここで前回の場所を指定!
filetypes=[("Excel files", "*.xlsx"), ("All files", "*.*")]
)
if not file_path:
print("ファイルが選択されませんでした。")
return
# 選択されたらパスを保存
save_last_path(file_path)
print(f"選択されたファイル: {file_path}")
try:
df = pd.read_excel(file_path)
for index, row in df.iterrows():
print(f"取得: {row['会社名']} {row['氏名']} 様")
except Exception as e:
print(f"エラー: {e}")
if __name__ == "__main__":
select_and_load_excel()
※VSCodeなどのエディターにてサンプルコードを実行して下さい

サンプルコード(mail-soft-test03.py)と同一フォルダ内に「Config.json」が自動生成されていれば成功です!
※すでに同一フォルダ内に「config.json」が存在している場合は、そのファイルから設定が呼び出されます。
■ こだわり
1. 「たかが1クリック、されど1クリック」
業務効率化ツールにおいて、ユーザーが何度も同じフォルダを探す手間を省くことは非常に重要です。この「小さな気遣い」の積み重ねが、ツールへの信頼と愛着に繋がります。
2. JSON形式の採用
設定ファイルには色々な形式がありますが、JSONは**「メモ帳で中身が見れる」「Pythonの辞書型(dict)と同じ感覚で使える」**というメリットがあります。
3. os.path.expanduser("~") の賢さ
初回起動時は設定ファイルがありません。その時に、エラーを出さずにとりあえず「ドキュメント」フォルダなどを開いてくれる、親切な設計にするための一工夫です。
ファイルの配置はどうなる?
プログラムを動かすと、以下のような構成になります。config.jsonは、初回実行時にプログラムが自動生成します。
作業フォルダ/
├── mailer.py (メインプログラム)
├── config.json (前回パスを記憶しているファイル)
└── client_list.xlsx
次回予告
これで「Excelをスマートに選ぶ」仕組みが整いました!
第3回はいよいよ、**「GUI(操作画面)でメール本文を作る」**ステップに進みます。 いよいよツールらしい見た目になってきますよ。お楽しみに!
実験販売ですが、期待もしつつ、まぁ売れないよなと思っていますw
応援購入お待ちしております。








コメント