ダイアログを使って、フォルダでファイルを一括選択する。
私たち放射線技師がDICOM画像を使って何か解析をしようとした際、CDやDVDといったメディアに画像を出力して自分のパソコンに取り込み、処理していることと思います。
そして、出力した画像はシリーズごとにフォルダに入っていますよね。
前回、前々会ではファイルを一つ、もしくは複数ファイルをそれぞれ選択して処理に回していきました。
今回は、フォルダを選択することで複数画像を一括で選択してしまおうという会です。
処理の流れ
まずは、
①ファイル名の一覧を取得したいディレクトリの指定
②ファイル名の一覧を取得する
といった流れとなります。
一覧取得するフォルダの指定
まずは、前回のファイルを複数選択するコードです。
# -*- coding: utf-8 -*-
import tkinter # tkinterをインポート
from tkinter import filedialog as tkFileDialog
# tkinterのfiledialogをインポート
def fileselect():
root = tkinter.Tk() # tkinterのインスタンスを生成
root.withdraw() # この一文が無いと謎の黒いウインドウが出てくるらしい
fTyp = [('', '*')] # ダイアログに表示するファイル種類を指定。
# 今回は指定なし
# fTyp=[('テキストファイル','*.txt')]
# 上記の様にすればテキストファイルのみに絞れる。
# ()を足していくことで複数指定することも可能。
iDir = 'C:/Desktop' # ダイアログが開くディレクトリを指定
# 今回はデスクトップ
filenames = tkFileDialog.askopenfilenames(filetypes=fTyp, initialdir=iDir)
return filenames # 選択ファイルの絶対パスを返します。
fname = fileselect() # fileselectの最後returnで返されたものをfnameに格納
print(fname) #選択したファイルのパスが表示される。
上記コードで今回修正するところは23行目
filenames = tkFileDialog.askopenfilenames(filetypes=fTyp, initialdir=iDir)
の行を以下のように変更します。
dirname = tkFileDialog.askdirectory(initialdir=iDir)
まず、ディレクトリを指定するので
dirnameという名前に変更します。
その後、
.askopenfilenames
の部分を
.askdirectory
と、filenamesからdirectoryに変更にします。
そして、引数の中のファイルタイプの指定 (filetypes=fTyp) は、ディレクトリの指定となるので必要なくなります。
これにより、一覧取得するフォルダの指定が完了です。
ファイル名取得
その後に、ファイル名の一覧取得になりますが、使用するモジュールはglobを使用しますのでまずはインポートしていきたいと思います。
7行目に以下のコードを追加します。
import glob
その後、26行目の return filenames の前に
filenames = glob.glob(dirname +”/*”)
の一文を追加します。
引数には、先ほど取得したディレクトリのパスを入れた変数名dirnameを入れます。
しかし、このままだとディレクトリを指定しているのでディレクトリの中を指定してあげるためにディレクトリのパスの後に / を追加する必要があるので
変数名dirname の後に +”/*” を追加してあげます。
なお、”*”はファイルの種類全てを指しています。もし、テキストファイルのみでしたら +”/*.txt”とすることで絞り込むことができます。
以上で完了です。
以下が本日のコードとなります。
# -*- coding: utf-8 -*-
import tkinter
from tkinter import filedialog as tkFileDialog
import glob # globをインポート
def fileselect():
root = tkinter.Tk()
root.withdraw()
iDir = 'C:/Desktop'
dirname = tkFileDialog.askdirectory(initialdir=iDir)
filenames = glob.glob(dirname +"/*")
return filenames
fname = fileselect() # fileselectの最後returnで返されたものをfnameに格納
print(fname)
いかがでしたか?結果下の図のように表示されていませんか?
次回は、リストで取得したパスをひとつづつ取り出して画像表示していく方法をやってみたいと思います。
環境
- windows10
- python3.6.1
- Anaconda custom(64-bit)
- PyCharm2020.2(Communication Edition)