環境システム株式会社公式HP

〒660-0083 兵庫県尼崎市道意町7-1-3
尼崎リサーチ・インキュベーションセンター512

アイコン06-6657-5130

アイコンsales@hydrolab.co.jp

お問い合わせ

アイコン06-6657-5130

アイコンsales@hydrolab.co.jp

お問い合わせ

蛇使いな彼女BLOG

【第65回】 研究会応答編②ー辞書の保存とパスについて #2.

2022.08.19

こんにちは、今日は前回の続きの説明をしていきます。
辞書保存のメソッドのうちスクリプトの25~41行目まで説明済みなので、残りの部分とFileOpenボタンを押したときのメソッドについてもお話しますね。

Save_func()の46行目からですが・・・
これはSaveNameが入力されていない場合の処理を書いています。
ポップアップ表示とテキストカラーを変更することで使用者に入力を促すのですが、一見特に意味なさげなワンクッションアクションで保存時のエラーと誤作動を防ぎます。

変数は上書きしない限り前の入力が入ったままとなっているので、アプリケーションであれば数通りの経路、入力値、また何回も同じ操作をする想定とリセットの意味も含めて
savefile=Noneとしています。
elif values['NAME'] in (None,'') : の部分も本来in (‘/’,‘¥’)などパスに使用不可な文字を指定するのがベストです。


大きなプロジェクトになると、各メソッド同士の変数の受け渡しを全てチェックしないといけません(T_T)


elif values['NAME'] in (None,'') : 
sg.Popup('SaveNameを入力してください!')
w['TXT'].update(text_color='red')
savefile=None
w['TXT2'].update('')
else:
pass


次にフォーマットしたファイルを読み込むメソッドです。


def open_func():
file=sg.popup_get_file('フォルダを選択してください。',file_types=(('JSON ファイル','*.json'),),default_path=pathlib.Path('__file__').parent.absolute())

#読み込み
with open(file, 'rb') as f:
dict_json = json.load(f)
w['OPEN_FILE'].update(dict_json)


OpenFileを押した時の動作ですが、
default_pathでpathlibを使って今開いているパイソンスクリプトの場所を絶対パスで表示させています。
(Browseボタンを押すとウィンドウの初期画面はなぜか最後に開いたディレクトリを表示するのが不思議ですが…。)↓

絶対パスと相対パス

Pathlibはos.pathより優秀なモジュールらしいですが、パスの構想が分かってないと扱い方が分からなかったのでここにメモしておきます。
default_path=pathlib.Path('__file__').parent.absolute()
.parentは一つ前の階層という意味で、__file__(今開いているスクリプトファイル)が置かれているディレクトリに当たります。
absolute()によって上位階層からの絶対パスを返します。


パスの構造について図示すると、以下のように絶対パスと相対パスの2種類があります。

↑図のように常に上の階層から数えた位置(WindowsならC:を始点)を絶対パスといいます。
見ただけで全体構造がすぐ分かるので、決まったファイルを開いたり、読み込みを行うときにはまず絶対パスを指定すれば問題ないです。

↑対して相対パスは今いる位置から下の階層に下がったり、上の階層にあがったりするときに少ない文字数で表記で表現できるのでWEBのページ遷移の時によく使われているかと思います。
一連のファイル構造を理解しておく必要があり、逆に1つのまとまりとして構造化されていない場合は絶対パスの使用をお勧めします。
例えばPythonプログラムのAディレクトリからスクリプトコードまでの相対パスは穴地階層にあるので“スクリプトコード“です。
Aディレクトリからreposディレクトリまでの相対パスは一つ上の階層なので”.“です。
これパスなの?と思うような短い記載が出来ます。
※コンソール画面上でディレクトリ移動する時と同じですね!

ちなみに、NumPyやPandasでCSVやテキストを開いたり保存したりするときは、絶対パスを指定しなければ基本的にいま開いているスクリプトコードのある位置を基準に動作します。
これらライブラリのモジュール達は相対パスの挙動をするんです(゚_゚)
ライブラリ、モジュールもまとまりとして構造化されているので納得ですね!!


さて、パスの話はこれくらいにして本題に戻りますね。

#読み込み
with open(file, 'rb') as f:
dict_json = json.load(f)
w['OPEN_FILE'].update(dict_json)

これはJSONファイルを読み込んでメモ帳に書き出すコードです。
書き込むときはバイナリにしないで行いましたが、読み込むときはmode=’r’/’rb’ どちらでも大丈夫みたいです💡

こんな感じに出力されます(*^_^*)
参考になりましたでしょうか??

では今回はこれにて!!

pagetop