Pythonの基礎を学んだあと、
「自分で何か作ってみたい!」と思う方も多いと思います!
そんな方にぴったりなのが、コンソールアプリケーション(CLI)の作成です。
この記事では、Pythonだけで完結する簡単なCLIアプリの作り方をわかりやすく解説します。
コンソールアプリを作れるようになると、
- ファイル整理
- タスク管理
- 作業の自動記録
など、身近な作業をサクッと自動化できるようになります。
さっそく一緒に作っていきましょう!
アプリの全体像
今回作成するのは、日々の予定や作業を簡単に管理できる「タスク管理アプリ」です。
このアプリでできることは、次の5つです。
- タスク一覧を表示する
- タスクを追加する
- タスクを完了にする
- タスクを削除する
- アプリを終了する
データはデータベースではなく、テキストファイルに保存される仕組みなので、
初学者の方でも中身を理解しやすくなっています。
それでは、ステップごとに完成イメージを見ていきましょう!
1. タスク一覧を表示する
メニューで「タスク一覧」を選択すると、保存されているタスクを読み込み、一覧表示します。
一覧には、タスクの内容と「完了しているかどうか」([ ]
or [×]
)の状態も一緒に表示されます。
完成イメージ
$ python main.py
メニュー
1. タスク一覧
2. タスク追加
3. タスク完了
4. タスク削除
5. 終了
番号を入力してください: 1
--- タスク一覧 ---
1. [ ] 勉強をする
2. [×] 散歩をする
-----------------
2. タスクを追加する
メニューで「タスク追加」を選択すると、追加したい内容の入力を求められ、テキストファイルに保存されます。
追加が完了すると、自動的にタスク一覧が表示され、正しく追加されたかどうかを確認できます。
完成イメージ
$ python main.py
メニュー
1. タスク一覧
2. タスク追加
3. タスク完了
4. タスク削除
5. 終了
番号を入力してください: 2
追加するタスクを入力してください: 読書をする
タスクを追加しました。
--- タスク一覧 ---
1. [ ] 勉強をする
2. [×] 散歩をする
3. [ ] 読書をする
-----------------
3. タスクを完了にする
メニューから「タスク完了」が選択されると、完了させたいタスクの番号を入力するように求められます。
入力された番号に対応するタスクの状態が更新され、チェックマーク([ ]
→[×]
)が付きます。
処理が完了すると、自動的にタスク一覧が再表示され、完了済みタスクを確認できます。
完成イメージ
$ python main.py
メニュー
1. タスク一覧
2. タスク追加
3. タスク完了
4. タスク削除
5. 終了
番号を入力してください: 3
完了するタスク番号を入力してください: 1
タスク 1 を完了しました。
--- タスク一覧 ---
1. [×] 勉強をする
2. [×] 散歩をする
3. [ ] 読書をする
-----------------
4. タスクを削除する
メニューから「タスク削除」が選択されると、削除したいタスクの番号を入力するように求められます。
完了済・未完了を問わず、どのタスクでも削除が可能です。
削除が完了すると、指定したタスクが一覧から取り除かれていることが確認できます。
完成イメージ
$ python main.py
メニュー
1. タスク一覧
2. タスク追加
3. タスク完了
4. タスク削除
5. 終了
番号を入力してください: 4
削除するタスク番号を入力してください: 2
タスク 2 を削除しました: [×] 散歩をする
--- タスク一覧 ---
1. [×] 勉強をする
2. [ ] 読書をする
-----------------
5. アプリを終了する
アプリの利用を終えるときは、メニューから「終了」を選択してプログラムを終了させます。
他の操作と同様に、番号を入力するだけで終了できます。
完了後はループが終了し、ターミナルが通常の待機状態に戻ります。
完成イメージ
$ python main.py
メニュー
1. タスク一覧
2. タスク追加
3. タスク完了
4. タスク削除
5. 終了
番号を入力してください: 5
終了します。
$
補足
- タスクの一覧表示や番号入力が必要な場面では、存在しない番号が入力された場合にも適切に対応できるようにしておきます。
例)存在しない番号を入力した場合の出力
メニュー
1. タスク一覧
2. タスク追加
3. タスク完了
4. タスク削除
5. 終了
番号を入力してください: 4
削除するタスク番号を入力してください: 100
無効な番号です。
- 「終了」が選択されない限りは、各処理が終わった後に再びメニューを表示し、次の操作を続けられるように設計しています。
例)処理完了後にメニューが再表示される様子
$ python main.py
メニュー
1. タスク一覧
2. タスク追加
3. タスク完了
4. タスク削除
5. 終了
番号を入力してください: 2
追加するタスクを入力してください: ご飯を作る
タスクを追加しました。
--- タスク一覧 ---
1. [×] 勉強をする
2. [ ] 読書をする
3. [ ] ご飯を作る
-----------------
メニュー
1. タスク一覧
2. タスク追加
3. タスク完了
4. タスク削除
5. 終了
番号を入力してください:
フォルダ構成
このタスク管理アプリは、以下のようなシンプルな構成のフォルダにしています。
cli_application/
├── main.py # アプリを起動するファイル
├── tasks.txt # タスクデータを保存するファイル
└── task/
├── manager.py # タスクの操作(追加・完了・削除)を行うファイル
└── storage.py # ファイルへの読み書きを行うファイル
タスク一覧処理を作成
1. メニュー表示とユーザー入力の処理を作成
まずは、アプリの基本となるメニュー表示とユーザーの選択処理を作成しましょう!
完成コード
# メニュー表示
def show_menu():
print("\nメニュー")
print("1. タスク一覧")
# メニュー選択に応じた処理
def handle_choice(choice):
if choice == "1":
print("タスク一覧を表示します。")
else:
print("\n無効な選択です。")
# メイン処理
def main():
show_menu()
choice = input("番号を入力してください: ")
handle_choice(choice)
if __name__ == "__main__":
main()
コード説明
main.py
- show_menu()
メニューを表示する関数。番号付きの選択肢を出力する。 - input(“番号を入力してください: “)
ユーザーに入力を促し、選択肢の番号を受け取る。 - handle_choice(choice)
- 入力された番号に応じて処理を分岐させる。
if choice == "1"
の時、タスク一覧の表示処理(ここでは仮実装としてprint("タスク一覧を表示します。"
を実行)
※後のセクションでmanager.list()
に書き換え予定。
2. タスクの操作定義を作成
タスク操作を担うTaskManagerクラスを持つmanager.py
と、データの読み書きを行うstorage.py
を作成しましょう!
完成コード
from task.manager import TaskManager
# メニュー表示
def show_menu():
print("\nメニュー")
print("1. タスク一覧")
# メニュー選択に応じた処理
def handle_choice(choice):
if choice == "1":
print("タスク一覧を表示します。")
else:
print("\n無効な選択です。")
# メイン処理
def main():
manager = TaskManager("tasks.txt")
show_menu()
handle_choice(input("番号を入力してください: "))
if __name__ == "__main__":
main()
from task.storage import load_tasks
class TaskManager:
# 初期化
def __init__(self, filepath):
self.filepath = filepath
self.tasks = load_tasks(filepath)
from pathlib import Path
# タスク一覧をファイルから読み込み
def load_tasks(filepath):
path = Path(filepath)
if not path.exists():
return []
return path.read_text(encoding="utf-8").splitlines()
コード説明
main.py
choice == "1"
のときにmanager.list()
を呼び出し、タスク一覧を表示する。- 無効な選択肢が入力された場合には、エラーメッセージを出力させる。
manager.py
list()
メソッドをTaskManagerクラスに追加。- タスクが存在しない時は、”タスクはありません”と表示し、存在する場合はenumerate()を使って1から番号付きで表示する。
storage.py
load_tasks()
関数では、指定されたテキストファイルからタスク一覧を読み込む。- ファイルが存在しない場合は空のリスト
[ ]
を返し、存在する場合はsplitlines()
によって行単位でリスト化する。 - ファイルの文字コードはUTF-8を指定。
3. 一覧表示処理を作成
次に、タスク一覧を表示する処理を追加しましょう!
登録済みのタスクがある場合には一覧表示し、ない場合は「タスクはありません」とメッセージを表示します。
完成コード
from task.manager import TaskManager
# メニュー表示
def show_menu():
print("\nメニュー")
print("1. タスク一覧")
# メニュー選択に応じた処理
def handle_choice(choice, manager):
if choice == "1":
manager.list()
else:
print("\n無効な選択です。")
# メイン処理
def main():
manager = TaskManager("tasks.txt")
show_menu()
handle_choice(input("番号を入力してください: "), manager)
if __name__ == "__main__":
main()
from task.storage import load_tasks
class TaskManager:
# 初期化
def __init__(self, filepath):
self.filepath = filepath
self.tasks = load_tasks(filepath)
# タスク一覧表示
def list(self):
if not self.tasks:
print("\nタスクはありません。")
return
print("\n--- タスク一覧 ---\n")
for i, task in enumerate(self.tasks, 1):
print(f"{i}. {task}")
print("\n------------------")
コード説明
main.py
choice == "1"
の時にmanager.list()
を呼び出して、タスク一覧を表示する。- 無効な選択肢が入力された場合には、エラーメッセージを出力する。
manager.py
list()
メソッドをTaskManagerクラスに定義。- タスクが存在しない場合は「タスクはありません」と表示し、存在する場合は
enumerate()
を使って1から番号付きで一覧表示する。
storage.py
load_tasks()
関数では、指定されたテキストファイルからタスク一覧を読み込む。- ファイルが存在しない場合は空のリスト
[ ]
を返す。 - 読み込み時は
splitlines()
によって行単位でリスト化する。
enumerate()の使い方補足
enumerate()
を使うことで、ループ内で自動的にインデックス(番号)を付けながら繰り返すことができる。- この場合、1から番号を表示するため
enumerate(..., 1)
としている。
4. 動作確認
それでは実行して、実際にアプリを動かしてタスク一覧が表示されるか確認してみましょう!
$ python main.py
メニュー
1. タスク一覧
番号を入力してください: 1
タスクはありません。
この時点では、tasks.txt
は空のため、アプリを実行しても「タスクはありません。」と表示されます。
今回は確認用として、tasks.txt
にタスクデータを手動で1行だけ追加してみます。
[ ] テストですよ
そして、再度実行!
$ python main.py
メニュー
1. タスク一覧
番号を入力してください: 1
--- タスク一覧 ---
1. [ ] テストですよ
------------------
このように、タスク一覧表示機能が正しく動作していることを確認できました!
タスク追加処理を作成
1. タスク追加メニューを追加
まずは、アプリメニューに「タスク追加」の選択肢を追加しましょう!
完成コード
from task.manager import TaskManager
# メニュー表示
def show_menu():
print("\nメニュー")
print("1. タスク一覧")
print("2. タスク追加")
# メニュー選択に応じた処理
def handle_choice(choice, manager):
if choice == "1":
manager.list()
elif choice == "2":
print("タスク追加処理を作成します")
else:
print("\n無効な選択です。")
# メイン処理
def main():
manager = TaskManager("tasks.txt")
show_menu()
handle_choice(input("番号を入力してください: "), manager)
if __name__ == "__main__":
main()
コード説明
main.py
if choice == "2"
の時、タスクの追加処理(ここでは仮実装としてprint("タスク追加処理を作成します")
を実行)
※後のセクションでmanager.add()
に書き換え予定。
2. 追加処理を作成
今回の処理追加では、以下の機能を実装していきます!
- タスク追加用の入力受付(
main.py
) - タスクを追加・保存する処理の追加(
manager.py
) - ファイルへの書き込み処理の追加(
storage.py
)
完成コード
from task.manager import TaskManager
# メニュー表示
def show_menu():
print("\nメニュー")
print("1. タスク一覧")
print("2. タスク追加")
# メニュー選択に応じた処理
def handle_choice(choice, manager):
if choice == "1":
manager.list()
elif choice == "2":
text = input("追加するタスクを入力してください: ")
manager.add(text)
manager.list()
else:
print("\n無効な選択です。")
# メイン処理
def main():
manager = TaskManager("tasks.txt")
show_menu()
handle_choice(input("番号を入力してください: "), manager)
if __name__ == "__main__":
main()
from task.storage import load_tasks, save_tasks
class TaskManager:
# 初期化
def __init__(self, filepath):
self.filepath = filepath
self.tasks = load_tasks(filepath)
# タスク保存
def _save(self):
save_tasks(self.tasks, self.filepath)
# タスク一覧表示
def list(self):
if not self.tasks:
print("\nタスクはありません。")
return
print("\n--- タスク一覧 ---\n")
for i, task in enumerate(self.tasks, 1):
print(f"{i}. {task}")
print("\n------------------")
# タスク追加
def add(self, text):
self.tasks.append(f"[ ] {text}")
self._save()
print("\nタスクを追加しました。")
from pathlib import Path
# タスク一覧をファイルから読み込み
def load_tasks(filepath):
path = Path(filepath)
if not path.exists():
return []
return path.read_text(encoding="utf-8").splitlines()
# タスク一覧をファイルに保存
def save_tasks(tasks, filepath):
Path(filepath).write_text("\n".join(tasks), encoding="utf-8")
コード説明
main.py
choice == "2"
の時に、manager.add()
を呼び出す。manager.list()
を呼び出すことで、タスク追加処理の後に一覧表示処理も行う。
manager.py
add()
メソッドを新たに定義。- タスクリストに
"f"[ ] {タスク内容}
の形式で追加。 save_tasks()
を使用して、テキストファイルに保存。
- タスクリストに
save_tasks()
でself.tasks
をtasks.txtに書き込み。
storage.py
save_tasks
関数を追加。- タスク一覧を1行ずつ書き出す形式でファイルに保存。
- 改行で区切るため、
"\n".join(tasks)
を使用。
3. 動作確認
それでは実行して、実際にタスクが追加されるか確認しましょう!
$ python main.py
メニュー
1. タスク一覧
2. タスク追加
番号を入力してください: 2
追加するタスクを入力してください: 読書をする。
タスクを追加しました。
--- タスク一覧 ---
1. [ ] テストですよ
2. [ ] 読書をする。
------------------
このように、タスク一覧に、追加されていることを確認できました!
タスク完了処理を作成
1. タスク完了メニューを追加
まずは、アプリメニューに「タスク完了」の選択肢を追加しましょう!
完成コード
from task.manager import TaskManager
# メニュー表示
def show_menu():
print("\nメニュー")
print("1. タスク一覧")
print("2. タスク追加")
print("3. タスク完了")
# メニュー選択に応じた処理
def handle_choice(choice, manager):
if choice == "1":
manager.list()
elif choice == "2":
text = input("追加するタスクを入力してください: ")
manager.add(text)
manager.list()
elif choice == "3":
print("タスク完了処理を作成します")
else:
print("\n無効な選択です。")
# メイン処理
def main():
manager = TaskManager("tasks.txt")
show_menu()
handle_choice(input("番号を入力してください: "), manager)
if __name__ == "__main__":
main()
コード説明
main.py
if choice == "3"
の時、タスクの完了処理(ここでは仮実装としてprint("タスク完了処理を作成します")
を実行)
※後のセクションでmanager.complete()
に書き換え予定。
2. 完了処理を作成
今回の処理追加では、以下の機能を実装していきます!
- タスク完了用の入力受付(
main.py
) - 完了状態を更新する処理の追加(
manager.py
)
完成コード
from task.manager import TaskManager
# メニュー表示
def show_menu():
print("\nメニュー")
print("1. タスク一覧")
print("2. タスク追加")
print("3. タスク完了")
# メニュー選択に応じた処理
def handle_choice(choice, manager):
if choice == "1":
manager.list()
elif choice == "2":
text = input("追加するタスクを入力してください: ")
manager.add(text)
manager.list()
elif choice == "3":
index = input("完了するタスク番号を入力してください: ")
if index.isdigit():
manager.complete(int(index))
manager.list()
else:
print("\n数値を入力してください。")
else:
print("\n無効な選択です。")
# メイン処理
def main():
manager = TaskManager("tasks.txt")
show_menu()
handle_choice(input("番号を入力してください: "), manager)
if __name__ == "__main__":
main()
from task.storage import load_tasks, save_tasks
class TaskManager:
# 初期化
def __init__(self, filepath):
self.filepath = filepath
self.tasks = load_tasks(filepath)
# タスク保存
def _save(self):
save_tasks(self.tasks, self.filepath)
# タスク一覧表示
def list(self):
if not self.tasks:
print("\nタスクはありません。")
return
print("\n--- タスク一覧 ---\n")
for i, task in enumerate(self.tasks, 1):
print(f"{i}. {task}")
print("\n------------------")
# タスク追加
def add(self, text):
self.tasks.append(f"[ ] {text}")
self._save()
print("\nタスクを追加しました。")
# タスク完了
def complete(self, index):
i = index - 1
if 0 <= i < len(self.tasks):
if self.tasks[i].startswith("[×]"):
print("\nすでに完了済みです。")
else:
self.tasks[i] = self.tasks[i].replace("[ ]", "[×]", 1)
self._save()
print(f"\nタスク {index} を完了しました。")
else:
print("\n無効な番号です。")
コード説明
main.py
choice == "3"
の時に、manager.complete()
を呼び出す。- 入力された番号は
int(index)
で変換され、対象タスクを完了状態に変更する。
manager.py
complte()
メソッドをTaskManagerクラスに追加。- タスク一覧からindexに対応するタスクを取得。
[ ]
を[×]
に置換し、完了状態を反映。save()
を呼び出し、更新後の一覧を保存。
3. 動作確認
それでは実行して、実際にタスク状態が完了になるか確認しましょう!
$ python main.py
メニュー
1. タスク一覧
2. タスク追加
3. タスク完了
番号を入力してください: 3
完了するタスク番号を入力してください: 1
タスク 1 を完了しました。
--- タスク一覧 ---
1. [×] テストですよ
2. [ ] 読書をする。
------------------
このように、タスク1が完了状態になったことを確認できました!
タスク削除処理を作成
1. タスク削除メニューを追加
まずは、アプリメニューに「タスク削除」の選択肢を追加しましょう!
完成コード
from task.manager import TaskManager
# メニュー表示
def show_menu():
print("\nメニュー")
print("1. タスク一覧")
print("2. タスク追加")
print("3. タスク完了")
print("4. タスク削除")
# メニュー選択に応じた処理
def handle_choice(choice, manager):
if choice == "1":
manager.list()
elif choice == "2":
text = input("追加するタスクを入力してください: ")
manager.add(text)
manager.list()
elif choice == "3":
index = input("完了するタスク番号を入力してください: ")
if index.isdigit():
manager.complete(int(index))
manager.list()
else:
print("\n数値を入力してください。")
elif choice == "4":
print("タスク削除処理を作成します")
else:
print("\n無効な選択です。")
# メイン処理
def main():
manager = TaskManager("tasks.txt")
show_menu()
handle_choice(input("番号を入力してください: "), manager)
if __name__ == "__main__":
main()
コード説明
main.py
if choice == "4"
の時、タスクの削除処理(ここでは仮実装としてprint("タスク削除処理を作成します")
を実行)
※後のセクションでmanager.delete()
に書き換え予定。
2. 削除処理を作成
今回の処理追加では、以下の機能を実装していきます!
- タスク削除用の入力受付(
main.py
) - タスクを削除する処理の追加(
manager.py
)
完成コード
from task.manager import TaskManager
# メニュー表示
def show_menu():
print("\nメニュー")
print("1. タスク一覧")
print("2. タスク追加")
print("3. タスク完了")
print("4. タスク削除")
# メニュー選択に応じた処理
def handle_choice(choice, manager):
if choice == "1":
manager.list()
elif choice == "2":
text = input("追加するタスクを入力してください: ")
manager.add(text)
manager.list()
elif choice == "3":
index = input("完了するタスク番号を入力してください: ")
if index.isdigit():
manager.complete(int(index))
manager.list()
else:
print("\n数値を入力してください。")
elif choice == "4":
index = input("削除するタスク番号を入力してください: ")
if index.isdigit():
manager.delete(int(index))
manager.list()
else:
print("\n数値を入力してください。")
else:
print("\n無効な選択です。")
# メイン処理
def main():
manager = TaskManager("tasks.txt")
show_menu()
handle_choice(input("番号を入力してください: "), manager)
if __name__ == "__main__":
main()
from task.storage import load_tasks, save_tasks
class TaskManager:
# 初期化
def __init__(self, filepath):
self.filepath = filepath
self.tasks = load_tasks(filepath)
# タスク保存
def _save(self):
save_tasks(self.tasks, self.filepath)
# タスク一覧表示
def list(self):
if not self.tasks:
print("\nタスクはありません。")
return
print("\n--- タスク一覧 ---\n")
for i, task in enumerate(self.tasks, 1):
print(f"{i}. {task}")
print("\n------------------")
# タスク追加
def add(self, text):
self.tasks.append(f"[ ] {text}")
self._save()
print("\nタスクを追加しました。")
# タスク完了
def complete(self, index):
i = index - 1
if 0 <= i < len(self.tasks):
if self.tasks[i].startswith("[×]"):
print("\nすでに完了済みです。")
else:
self.tasks[i] = self.tasks[i].replace("[ ]", "[×]", 1)
self._save()
print(f"\nタスク {index} を完了しました。")
else:
print("\n無効な番号です。")
# タスク削除
def delete(self, index):
i = index - 1
if 0 <= i < len(self.tasks):
deleted = self.tasks.pop(index - 1)
self._save()
print(f"\nタスク {index} を削除しました: {deleted}")
else:
print("\n無効な番号です。")
コード説明
main.py
choice == "4"
の時にmanager.delete()
を呼び出す。- 入力された番号は
int(index)
で変換され、対象タスクをdelete()
に渡して処理を行う。
manager.py
delete()
メソッドをTaskManagerクラスに追加。- 入力された番号をもとに、対象のタスクを削除。
- 削除対象のタスクが存在すれば、リストから削除し保存処理
save()
を実行。
- タスク一覧の状態が変更後も、
save()
を再利用しtasiks.txtに自動保存。
3. 動作確認
それでは実行して、実際にタスクが削除されるか確認しましょう!
$ python main.py
メニュー
1. タスク一覧
2. タスク追加
3. タスク完了
4. タスク削除
番号を入力してください: 4
削除するタスク番号を入力してください: 1
タスク 1 を削除しました: [×] テストですよ
--- タスク一覧 ---
1. [ ] 読書をする。
------------------
このように、[×] テストですよ
のタスクが削除されたことを確認できました!
アプリ終了処理を作成
1. 終了処理を作成
最後に、アプリを終了させる処理を作成しましょう!
また、「終了」が選択されない限り、各機能の処理が終わった後に再びメニューが表示されるように変更します。
完成コード
from task.manager import TaskManager
# メニュー表示
def show_menu():
print("\nメニュー")
print("1. タスク一覧")
print("2. タスク追加")
print("3. タスク完了")
print("4. タスク削除")
print("5. 終了")
# メニュー選択に応じた処理
def handle_choice(choice, manager):
if choice == "1":
manager.list()
elif choice == "2":
text = input("追加するタスクを入力してください: ")
manager.add(text)
manager.list()
elif choice == "3":
index = input("完了するタスク番号を入力してください: ")
if index.isdigit():
manager.complete(int(index))
manager.list()
else:
print("\n数値を入力してください。")
elif choice == "4":
index = input("削除するタスク番号を入力してください: ")
if index.isdigit():
manager.delete(int(index))
manager.list()
else:
print("\n数値を入力してください。")
elif choice == "5":
print("\n終了します。")
return False
else:
print("\n無効な選択です。")
return True
# メイン処理
def main():
manager = TaskManager("tasks.txt")
while True:
show_menu()
if not handle_choice(input("番号を入力してください: "), manager):
break
if __name__ == "__main__":
main()
コード説明
main.py
choice == "5"
の場合に「終了します。」を表示し、Falseを返してwhileループを抜け、アプリを終了させる。while True
によってメニュー表示と処理を繰り返すが、handle_choice()
の戻り値がFalseの時にbreakされ、終了させる。- その他の選択肢(1~4)が入力された場合には、それぞれの機能(一覧表示、追加、完了、削除)を実行する。
2. 動作確認
それでは実行して、確認しましょう!
$ python main.py
メニュー
1. タスク一覧
2. タスク追加
3. タスク完了
4. タスク削除
5. 終了
番号を入力してください: 1
--- タスク一覧 ---
1. [ ] 読書をする。
------------------
メニュー
1. タスク一覧
2. タスク追加
3. タスク完了
4. タスク削除
5. 終了
番号を入力してください: 5
終了します。
$
このように、「5. 終了」を選択したときだけアプリが終了し、それ以外の操作ではメニューが再表示されることが確認できました!
これですべての基本機能を備えたCLIアプリが完成しました!
まとめ
この記事では、Pythonの基礎を終えた方向けに、「Pythonだけで完結するシンプルなCLIアプリ」の作り方をご紹介しました。
実際の現場でも、ちょっとした業務をPythonスクリプトで自動化する機会はよくあります。
また、こうしたCLIアプリの知識は、身近なタスクの効率化にも役立つと思います!
まずはこの記事で作成したようなCLIアプリを、自分でも一度手を動かして再現してみましょう!
慣れてきたら、ExcelやCSVと連携させたツールにも発展させてみてください!
かなり長い記事になりましたが、最後まで読んでいただきありがとうございました!