前回は、 Python でのファイル・フォルダ一覧の取得や基本的な操作 を学習しながら、クラウドストレージ(想定)にアップロードされたファイルをより細かなフォルダに分割・保存する方法を学びました。
なぜ、わざわざアップロードされたファイルを更に整理するかというと、検索性の確保とクラウドストレージの共有方法によっては、取引先によりファイルが削除されてしまう恐れがあったからでした。2022 年現在、改正電子帳簿保存法によりクラウドストレージ(訂正・削除の記録がされるもの)による保存が認められていますが、このようなトラブルを避けるのであれば、改正前と同じく認定タイムスタンプを活用するのが安心です。みんなのタイムスタンプ等であれば、低コストから導入できるので、取引数が限られている場合などは、こちらの方が低コストでしょう。
さて、今回は、前回の課題である「書類の種類や内容をファイル名に反映させられない」という問題に、まずは人間の手で対応していきたいと思います。
結局、人間の目と手と頭が必要
AI, 機械学習や RPA, または IoT などの普及により人手を削減、生産性を向上させる取り組みが一般化しています。しかし、そうはいっても未だに最終的に人間の確認の必要性は残っています。書類の正当性やその金額などはその最たるものですね。
ということで、今回は整理のために移動するファイル名を人手でも加工できるようにします。
人手が入るなら大差ないのでは?
そうでもありません。例えば、ファイルを Ctrl + X で該当フォルダに移動するだけで、数秒~数十秒はかかりますし、アップロード日を入力となればなおのことです。
また、前回のスクリプトで移動した後のファイルを編集しようと思うと、自動入力された部分は残してファイル名を編集する必要があり、ミスや工程の増加につながります。生産性の向上のためには繰り返される処理の効率化と、精神面を含めた労働者の負荷の軽減が肝要です。できないもの・かけられないコストは仕方がないですが、できるところは丁寧にサポートできるようにしましょう。
PySimpleGUI を使う
前回の完成 Script であればCUI から入力してもらう方法もあります。ただ、想像以上に CUI, 黒い画面への忌避感は強烈です。今回は Python で GUI を作成できるパッケージの中でも簡単な PySimpleGUI を利用します。
簡単に使える パッケージ、ライブラリの欠点は機能が充分でなかったり、細かなカスタマイズなどができない点です。そういったところを省いているからこそ、簡単に扱えます。今回は、繰り返し処理されるファイルに、名前を付ける程度なので簡単なものを採用しています。
一方で、 Python には Eel などのように HTML+CSS+JavaScript を活用して高度な GUI を構築できるものもあります。 MVC モデルや MVVC でアプリケーションを構築したい場合は、便利でしょう。または、見やすい GUI を作りたいときに、 HTML+CSS で構築するといった用途に使えます。
PySimpleGUI のインストールは、 pip を使い、
pip install pysimplegui
または
py -m pip install pysimplegui
#windows で Py を使い複数バージョンを使っている場合など
でインストールできます。使うときは import PySimpleGUI ですね(長いので as sg とするのが公式流のようです)。
PySimpleGUI は(英語の)ドキュメントが充実しているので、一通りの使い方は公式のドキュメント、特に Cookbook から学習できます。
この記事では実践編ということで、前回のスクリプトに組み込んでいきます。
ロジック・要件を考える
検索要件を満たす上では、
- 取引相手
- 取引における日付・その他の日付
- 金額
が必要になります。1, 2 は前回のスクリプトで自動的に入力されました。その他、法的には定められていませんが、書類の種類(契約書、領収書、請求書、見積書……等)も区別できると便利そうです。また電帳法関連以外の社内で使用される設計書などにも適用したいときなどに、必要となりそうです。これは選択式がよさそうですね。
残るは金額ですが、これは人間が目視で確認する以外、今のところ方法がなさそうです。ただ、元のファイルをいちいち開いて確認するのは大変そうです。ファイルを移動する前に、自動で開いてくれたら、次々と処理が捗りそうです。
今回はこれらの要件を満たすように作って行きます。
PySimpleGUI で GUI をつくる!
ベースになるスクリプトは 前回の記事 を参照。
毎回、ファイルが移動されてしまうとデバッグが大変になるので move メソッドの行をコメントアウトしておきます。また、いつでも元に戻れるようにファイルをコピーしておいてもいいでしょう。
# sh.move(f, '\\'.join([moveto_root, c, year, month, new_name])) #移動先にファイルを移動する
ファイル名を変更してバージョン管理するのは、プログラム開発上よくない習慣