PR

tkinterのfiledialogでExcelファイルを選択する方法|前回フォルダの記憶も実装【開発記②】

Python
スポンサーリンク

前回の課題|固定フォルダ問題を解決する

こんにちは、ニンジンです🥕
第1回では、pandasを使ってExcelの中身を読み込むところまで実装しました。ただし、前回のコードには大きな制約がありました。「プログラムと同じフォルダにExcelを置かないと動作しない」という点です。

実際の業務では、デスクトップや共有フォルダなど、Excelの保存場所はさまざまです。今回は、Windowsで見慣れた「ファイルを開く」画面を実装し、さらに「直前に開いた場所を記憶する」仕組みを追加します。

スポンサーリンク

tkinterのfiledialogでExcelファイルを選択する【サンプルコード】

任意のフォルダからファイルを選べるようにするために、Python標準のGUIライブラリtkinterに含まれるfiledialogを使用します。

氏名、アドレス、会社名のデータは
第1回と同じExcelファイルを使用します。

サンプルコード(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などのエディターにてサンプルコードを実行して下さい

  • コードを実行すると、Windowsで開くボタンを押すと現れる、いつものアレが立ち上がります。
  • 対象のExcelファイルを選択し、「開く」をクリック
  • ターミナルにExcelのデータが吸い出され、出力されていれば成功です!

コードのポイント

  • 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などのエディターにてサンプルコードを実行して下さい

コード実行すると
ブログでは説明し辛いですが
前回開いたフォルダが開かれます。

ターミナルにExcelのデータが吸い出され、出力されます。

サンプルコード(mail-soft-test03.py)と同一フォルダ内に「Config.json」が自動生成されていれば成功です!
※すでに同一フォルダ内に「config.json」が存在している場合は、そのファイルから設定が呼び出されます。

設計上の工夫点

1. 直前のフォルダを記憶する

毎回同じフォルダを探す手間を省き、操作回数を減らすため

2. 設定ファイルにJSON形式を採用

テキストエディタで中身を確認しやすく、Pythonの辞書型(dict)と同じ感覚で扱えるため

3. os.path.expanduser("~")を初期値に使用

初回起動時など設定ファイルがない場合でも、エラーを出さずにホームディレクトリを開けるようにするため

ファイルの配置はどうなる?

プログラムを実行すると、以下のような構成になります。config.jsonは初回実行時に自動生成されます。

作業フォルダ/
├── mailer.py (メインプログラム)
├── config.json (前回パスを記憶しているファイル)
└── client_list.xlsx
スポンサーリンク

まとめ|次回はGUIで本文を作成する

今回で、Excelファイルを柔軟な場所から選び、直前のフォルダを記憶する仕組みが整いました。

次回は、GUI(操作画面)上でメール本文を作成するステップに進みます。ツールとしての見た目が、ここから整っていきます。

今回紹介したコードを含む開発の詳細は、Noteにて販売しています。コードに関心がある方も、コードは難しそうと感じる方も、内容だけでも覗いてみてください。

実験的な販売のため、大きな反響は予想していませんが、よろしければご覧ください。
応援購入お待ちしております。

スポンサーリンク

NINJIN Mailシリーズはこちら

【PythonとpandasでExcelの顧客データを読み込む方法|メール自動化開発記①

pywin32でOutlookを操作してメールを自動送信する方法|Python開発記③


PROJECT LOG — SERIES INDEX
スポンサーリンク

シリーズ記事一覧

電子工作・自動化ツールの製作記録をシリーズごとにまとめています。気になるテーマからお読みください。


コメント