解析エンジニアの自動化 blog

コツコツと自動化した方法を残す blog

Python で ファイル選択ダイアログを使う



こんにちは。
仕事の自動化にやりがいと達成感を感じるガッくんです。


この記事の目次



背景・目的


Python で分析を始めたいと思ってグラフの描き方を調べました。
まだ、基本的なグラフの書き方だけですが…

今回は ファイル選択ダイアログを使ってみます。

グラフの描き方は少しわかってきたので、グラフにする値の読み込みに少し力を入れたいと思います。



動作環境


Windows 7
・winpython 64bit 3.4.4



プログラム

ソースコード


###############################################################################
# メッセージボックスとファイル選択ダイアログの GUI プログラム
###############################################################################
# モジュールのインポート
import os, tkinter, tkinter.filedialog, tkinter.messagebox
import sys
 
#==============================================================================
# 設定
#==============================================================================
program_name = 'GUIプログラム' # プログラム名設定
 
flag_type = 0 # 読み込むファイルの形式設定
# 0 : すべてのファイル
# 1 : cvs ファイルのみ
# 2 : xls ファイルのみ
# 3 : xlsx ファイルのみ
# 4 : xls, xlsx ファイルのみ
# 5 : txt ファイルのみ
# 6 : mp3 ファイルのみ
 
flag_multi_select = 1 # ファイル選択可能数設定
# 0 : 単一ファイル選択
# 1 : 複数ファイル選択
 
#==============================================================================
# GUI プログラム
#==============================================================================
# Tk オブジェクトのインスタンス作成
root = tkinter.Tk()
 
# Tk のウィンドウを非表示にする
root.withdraw()
 
# 読み込むファイル形式の設定
if   flag_type == 0:
    extension = [("すべてのファイル", "*")]    # すべてのファイル
elif flag_type == 1:
    extension = [("csvファイル","*.csv")]    # cvs ファイルのみ
elif flag_type == 2:
    extension = [("Excelファイル","*.xls")]  # xls ファイルのみ
elif flag_type == 3:
    extension = [("Excelファイル","*.xlsx")] # xlsx ファイルのみ
elif flag_type == 4:
    extension = [("Excelファイル","*.xls"),
            ("Excelファイル","*.xlsx")] # xls, xlsx ファイルのみ
elif flag_type == 5:
    extension = [("テキストファイル","*.txt")]   # txt ファイルのみ
elif flag_type == 6:
    extension = [("音声ファイル","*.mp3")]   # mp3 ファイルのみ
 
# ファイル選択ダイアログのイニシャルディレクトリの設定
initDir = os.path.abspath(os.path.dirname(__file__))
 
# メッセージボックスの表示
tkinter.messagebox.showinfo(program_name, 'ファイルを選択してください.')
 
# ファイル選択ダイアログの表示
if flag_multi_select == 0:
    file = tkinter.filedialog.askopenfilename(filetypes = extension, initialdir = initDir)
    if file == "":
        tkinter.messagebox.showinfo(program_name, '処理を中断します.')
        sys.exit()
    # 処理ファイル名の出力
    tkinter.messagebox.showinfo(program_name, file)
    print(file)
else:
    files = tkinter.filedialog.askopenfilenames(filetypes = extension, initialdir = initDir)
    if files == "":
        tkinter.messagebox.showinfo(program_name, '処理を中断します.')
        sys.exit()
    l = list(files)
    # 処理ファイル名の出力
    tkinter.messagebox.showinfo(program_name, l)
    print(l)
 
#==============================================================================
# ファイル処理プログラム
#==============================================================================
 
 
print('\ncomplete!!')



結果

意外と楽でした。

図1 は実行して表示されたファイル選択ダイアログです。

図1 ファイル選択ダイアログ


図2 は『 dir.txt 』というファイルを選択した時の表示です。

図2 ファイル選択結果表示


図3 は『 dir.txt 』と『 dir1.txt 』いうファイルを選択した時の表示です。

図3 複数ファイル選択結果表示



コメント

グラフ出力のコードと合わせれば、アプリケーションっぽくなると思います。

これをテンプレートみたいに使いまわして、ソースコードの『 # ファイル処理プログラム 』よりも下の行に処理プログラムを入れれば、簡単にいろんなファイルの処理プログラムが作れます。

単一ファイル選択の時は下の様にファイルパスが文字列として取得できます。


In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/GUI0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
C:/Users/UserName/Desktop/dir.txt
 
complete!!



また、複数ファイル選択の時は下の様にファイルパスが配列として取得できます。

In [1]: runfile('C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3/GUI0.0.py', wdir='C:/WinPython-64bit-3.4.4.6Qt5/settings/.spyder-py3')
['C:/Users/UserName/Desktop/dir1.txt', 'C:/Users/UserName/Desktop/dir.txt']
 
complete!!



以上