こんにちは。とらのあなラボでインフラエンジニアをやっているコニシです。
普段はbashなどで行なっているルーティン業務を、自分のWindows上でPythonを利用して
業務の効率化を行ってみたので紹介いたします。
どんなことをAIに考えてもらったのか?
実施内容:
社内のwebサイトからダウンロードできる(部署名).xlsx が 20程度あるファイルの処理を月に1度実施しています。
. ├── 01_虎太郎部長配下 │ └── YYYYMM │ ├── A部署.xlsx │ └── C部署.xlsx ├── 02_虎次郎部長配下 │ └── YYYYMM │ └── B部署.xlsx └── 03_虎三郎部長配下 └── YYYYMM ├── A部署.xlsx └── B部署.xlsx : :
上記のような構成のディレクトリの下に、ファイルを手動で移動させていました。
※YYYYMM フォルダは、ファイルに月末までの情報が記載されているので実施月の1か月前になります。
この作業がファイル数が多くなると地味に時間がかかり、ファイルを移動し忘れたりする場合もあったためPythonで自動化するためのコードをAIに考えてもらいました。
AIに聞く前にロジックを考えた
処理の流れは以下みたいな感じかな?とまずは自身で整理
移動処理可能かチェック
対象のxlsxファイルは存在するのか?
対象の部長フォルダは存在するのか?
部長フォルダ配下のYYYYMM(処理年月) フォルダは存在するのか?
対象の処理月を標準入力
- 対象の処理月を入力し、フォルダがなければ作成する。
移動処理の実行
対象のxlsxファイルを対象のフォルダに移動する。
ファイルが存在していれば、標準出力に状況を出力する。
といったところでしょうか。
AIに聞く!事細かに漏れなく指示!
やってほしい処理を1行1行書いた方がきれいなコードになるかも?
と想像したのでとにかく細かい処理を指示しました。
WindowsにPythonをインストールしているのでCドライブ上でテストしています。
以下をpython で出力してください。 --変数部分 移動元ファイルの場所は C:\移動元です。 移動先ファイルの場所は C:\移動先です。 --標準入力部分 YYYYMM を変数として扱い、年と月を6桁の数値で標準入力で指定できるようにしてください。 また数値以外が入力されたとき、桁が違うときは再度入力を促す処理を行ってください。 --チェック処理 チェック処理開始と標準出力してください。 カレントディレクトリにファイル:A部署.xlsx が存在しているかチェックし、あれば続行なければexit1 で終了 カレントディレクトリにファイル:B部署.xlsx が存在しているかチェックし、あれば続行なければexit1 で終了 カレントディレクトリにファイル:C部署.xlsx が存在しているかチェックし、あれば続行なければexit1 で終了 移動先フォルダの C:\移動先 に01_虎太郎部長配下 が存在しているかチェックし、あれば続行なければexit1 で終了 移動先フォルダの C:\移動先 に02_虎次郎部長配下 が存在しているかチェックし、あれば続行なければexit1 で終了 移動先フォルダの C:\移動先 に03_虎三郎部長配下 が存在しているかチェックし、あれば続行なければexit1 で終了 C:\移動先\01_虎太郎部長配下フォルダ\YYYYMM のフォルダが存在しているかチェックし、あれば続行なければYYYYMM を作成し続行 C:\移動先\02_虎次郎部長配下フォルダ\YYYYMM のフォルダが存在しているかチェックし、あれば続行なければYYYYMM を作成し続行 C:\移動先\03_虎三郎部長配下フォルダ\YYYYMM のフォルダが存在しているかチェックし、あれば続行なければYYYYMM を作成し続行 チェック処理終了と標準出力してください。 --処理部分 処理開始と標準出力してください。 C:\移動先\虎太郎部長配下フォルダ\YYYYMM のフォルダに、A部署.xlsx ,C部署.xlsx をコピーしてください。 C:\移動先\虎次郎部長配下フォルダ\YYYYMM のフォルダに、B部署.xlsx をコピーしてください。 C:\移動先\虎三郎部長配下フォルダ\YYYYMM のフォルダに、A部署.xlsx, B部署.xlsx をコピーしてください。
AIの初回回答
import os import shutil import sys # 変数定義 source_directory = r"C:\移動元" destination_directory = r"C:\移動先" # YYYYMM の入力と検証 while True: yyyymm = input("年月を6桁の数値 (YYYYMM) で入力してください: ") if yyyymm.isdigit() and len(yyyymm) == 6: break else: print("入力が正しくありません。もう一度入力してください。") print("チェック処理開始") # 必要なファイルの存在チェック required_files = ["A部署.xlsx", "B部署.xlsx", "C部署.xlsx"] for file in required_files: if not os.path.exists(os.path.join(source_directory, file)): print(f"ファイル {file} が存在しません。") sys.exit(1) # 移動先のディレクトリ存在チェックとYYYYMMフォルダの準備 managers = ["01_虎太郎部長配下", "02_虎次郎部長配下", "03_虎三郎部長配下"] for manager in managers: manager_path = os.path.join(destination_directory, manager) if not os.path.exists(manager_path): print(f"フォルダ {manager_path} が存在しません。") sys.exit(1) yyyymm_path = os.path.join(manager_path, yyyymm) if not os.path.exists(yyyymm_path): os.makedirs(yyyymm_path) print("チェック処理終了") print("処理開始") # ファイルのコピー shutil.copy(os.path.join(source_directory, "A部署.xlsx"), os.path.join(destination_directory, "01_虎太郎部長配下", yyyymm, "A部署.xlsx")) shutil.copy(os.path.join(source_directory, "C部署.xlsx"), os.path.join(destination_directory, "01_虎太郎部長配下", yyyymm, "C部署.xlsx")) shutil.copy(os.path.join(source_directory, "B部署.xlsx"), os.path.join(destination_directory, "02_虎次郎部長配下", yyyymm, "B部署.xlsx")) shutil.copy(os.path.join(source_directory, "A部署.xlsx"), os.path.join(destination_directory, "03_虎三郎部長配下", yyyymm, "A部署.xlsx")) shutil.copy(os.path.join(source_directory, "B部署.xlsx"), os.path.join(destination_directory, "03_虎三郎部長配下", yyyymm, "B部署.xlsx")) print("処理終了")
AIの初回回答をもう少しわかりやすくしてほしいことをざっくり依頼
自分にはなんとなく処理はわかるものの視認性をよくしてほしかったので
なんとかしてほしい旨を聞いてみました。
もう少しシンプルに行数を短くできないでしょうか? 処理開始部分をもう少しわかりやすくしてください ファイルベースでなく、フォルダを起点にして記載できないですか?
できあがったサンプルコード
import os import shutil import sys # 変数定義 src_dir = r"C:\移動元" dest_dir = r"C:\移動先" # ディレクトリ作成用関数 def ensure_directory(path): if not os.path.exists(path): os.makedirs(path) # 存在チェック用関数 def ensure_exists(path): if not os.path.exists(path): print(f"必要なファイルまたはディレクトリ {path} が存在しません。") sys.exit(1) # YYYYMM 入力と検証 yyyymm = input("年月を6桁の数値 (YYYYMM) で入力してください: ") while not (yyyymm.isdigit() and len(yyyymm) == 6): yyyymm = input("入力が正しくありません。もう一度入力してください: ") print("チェック処理開始") # 移動先のディレクトリとYYYYMMフォルダの確保 manager_folders = { "01_虎太郎部長配下": ["A部署.xlsx", "C部署.xlsx"], # このフォルダにはA部署とC部署のファイルをコピー "02_虎次郎部長配下": ["B部署.xlsx"], # このフォルダにはB部署のファイルをコピー "03_虎三郎部長配下": ["A部署.xlsx", "B部署.xlsx"] # このフォルダにはA部署とB部署のファイルをコピー } full_paths = {} for manager, files in manager_folders.items(): path = os.path.join(dest_dir, manager, yyyymm) ensure_directory(path) full_paths[manager] = path for file in files: ensure_exists(os.path.join(src_dir, file)) print("チェック処理終了") print("処理開始") # ファイルのコピー for manager, files in manager_folders.items(): for file in files: src_file_path = os.path.join(src_dir, file) dest_file_path = os.path.join(full_paths[manager], file) shutil.copy(src_file_path, dest_file_path) print(f"{file} を {dest_file_path} にコピーしました。") print("処理終了")
動作確認
Windowsなので、PowerShell を起動して、移動元フォルダに work.py としてサンプルコードを保存・実行してみました。
PS C:\移動元> python.exe .\work.py 年月を6桁の数値 (YYYYMM) で入力してください: 202410 チェック処理開始 チェック処理終了 処理開始 A部署.xlsx を C:\移動先\01_虎太郎部長配下\202410\A部署.xlsx にコピーしました。 C部署.xlsx を C:\移動先\01_虎太郎部長配下\202410\C部署.xlsx にコピーしました。 B部署.xlsx を C:\移動先\02_虎次郎部長配下\202410\B部署.xlsx にコピーしました。 A部署.xlsx を C:\移動先\03_虎三郎部長配下\202410\A部署.xlsx にコピーしました。 B部署.xlsx を C:\移動先\03_虎三郎部長配下\202410\B部署.xlsx にコピーしました。 処理終了
うまくうごいているようです!
Windowsの場合は、ネットワークドライブの利用でドライブレターを変更できるため、変数部分の編集でファイルサーバに置くことも可能そうです。
また、部署や担当の部長が変更になっても、どの部分を修正すればいいかわかりやすくなったと思います!
簡単な作業ですがとにかくループする作業や、ミスがでそうな作業を自動化でき業務効率もあがったと思います。参考になれば幸いです。
採用情報
虎の穴ラボでは一緒に働く仲間を募集中です!
この記事を読んで、興味を持っていただけた方はぜひ弊社の採用情報をご覧ください。
toranoana-lab.co.jp