lexhouk / goit-algo-hw-04 Goto Github PK
View Code? Open in Web Editor NEWМодуль 4. Робота з файлами та модульна система
Home Page: https://www.edu.goit.global/uk/learn/21196455/19951493/19951578/homework
Модуль 4. Робота з файлами та модульна система
Home Page: https://www.edu.goit.global/uk/learn/21196455/19951493/19951578/homework
У вас є текстовий файл, який містить інформацію про місячні заробітні плати розробників у вашій компанії. Кожен рядок у файлі містить прізвище розробника та його заробітну плату, які розділені комою без пробілів.
Наприклад:
Alex Korp,3000
Nikita Borisenko,2000
Sitarama Raju,1000
Ваше завдання - розробити функцію total_salary(path)
, яка аналізує цей файл і повертає загальну та середню суму заробітної плати всіх розробників.
total_salary(path)
має приймати один аргумент - шлях до текстового файлу (path
).with
для читання файлів.split(',')
.total, average = total_salary("path/to/salary_file.txt")
print(f"Загальна сума заробітної плати: {total}, Середня заробітна плата: {average}")
Очікуваний результат:
Загальна сума заробітної плати: 6000, Середня заробітна плата: 2000
Розробіть скрипт, який приймає шлях до директорії в якості аргументу командного рядка і візуалізує структуру цієї директорії, виводячи імена всіх піддиректорій та файлів. Для кращого візуального сприйняття, імена директорій та файлів мають відрізнятися за кольором.
colorama
для реалізації кольорового виведення.colorama
. Для цього створіть та активуйте віртуальне оточення Python, а потім встановіть пакет за допомогою pip
.sys
для отримання шляху до директорії як аргументу командного рядка.pathlib
.colorama
.colorama
.Якщо виконати скрипт та передати йому абсолютний шлях до директорії як параметр.
$ python hw03.py /шлях/до/вашої/директорії
Це призведе до виведення в терміналі списку всіх піддиректорій та файлів у вказаній директорії з використанням різних кольорів для піддиректорій та файлів, що полегшить візуальне сприйняття файлової структури.
Для директорії зі наступною структурою
📦picture
┣ 📂Logo
┃ ┣ 📜IBM+Logo.png
┃ ┣ 📜ibm.svg
┃ ┗ 📜logo-tm.png
┣ 📜bot-icon.png
┗ 📜mongodb.jpg
Скрипт повинен вивести схожу структуру
Напишіть консольного бота помічника, який розпізнаватиме команди, що вводяться з клавіатури, та буде відповідати відповідно до введеної команди.
☝ Бот помічник повинен стати для нас прототипом застосунку-асистента, який ми розробимо в наступних домашніх завданнях. Застосунок-асистент в першому наближенні повинен вміти працювати з книгою контактів та календарем.
У цій домашній роботі зосередимося на інтерфейсі самого бота. Найпростіший і найзручніший на початковому етапі розробки інтерфейс - це консольний застосунок CLI (Command Line Interface). CLI достатньо просто реалізувати. Будь-який CLI складається з трьох основних елементів:
handler
, вони відповідають за безпосереднє виконання команд.handler
-а.На першому етапі наш бот-асистент повинен вміти зберігати ім'я та номер телефону, знаходити номер телефону за ім'ям, змінювати записаний номер телефону, виводити в консоль всі записи, які зберіг. Щоб реалізувати таку нескладну логіку, скористаємося словником. У словнику будемо зберігати ім'я користувача, як ключ, і номер телефону як значення.
main()
, яка управляє основним циклом обробки команд.parse_input()
, яка розбиратиме введений користувачем рядок на команду та її аргументи. Команди та аргументи мають бути розпізнані незалежно від регістру введення."exit"
або "close"
, програма повинна завершувати виконання.add_contact()
, change_contact()
, show_phone()
тощо.По перше, нам треба систематизувати опис форматів наших команд для консольного бота-помічника. Це допоможе зрозуміти які функції треба зробити для кожної команди. Зробімо це:
Команда "hello"
, тут можна обійтись поки без функції та використати звичайний print
:
"hello"
"How can I help you?"
Команда "add [ім'я] [номер телефону]"
. Для цієї команди зробимо функцію add_contact
:
"add John 1234567890"
"Contact added."
Команда "change [ім'я] [новий номер телефону]"
. Для цієї команди зробимо функцію change_contact
:
"change John 0987654321"
"Contact updated."
або повідомлення про помилку, якщо ім'я не знайденоКоманда "phone [ім'я]"
. Для цієї команди зробимо функцію show_phone
:
"phone John"
[номер телефону]
або повідомлення про помилку, якщо ім'я не знайденоКоманда "all"
. Для цієї команди зробимо функцію show_all
:
"all"
Команда "close"
або "exit"
. Оскільки тут треба перервати виконання програми, можна поки обійтись без функції для цих команд:
"Good bye!"
та завершення роботи ботаБудь-яка команда, яка не відповідає вищезазначеним форматам, буде вважатися нами невірною, і бот буде виводити повідомлення "Invalid command."
Почнемо з простого варіанту CLI-бота:
def main():
print("Welcome to the assistant bot!")
while True:
command = input("Enter a command: ").strip().lower()
if command in ["close", "exit"]:
print("Good bye!")
break
elif command == "hello":
print("How can I help you?")
else:
print("Invalid command.")
if __name__ == "__main__":
main()
Коли програма запускається, вона виводить повідомлення "Welcome to the assistant bot!"
і входить в нескінчений цикл, де вона очікує введення команди від користувача while True
.
Якщо користувач вводить "close"
або "exit"
, програма виводить "Good bye!"
та завершує роботу. За це відповідає блок коду:
if command in ["close", "exit"]:
print("Good bye!")
break
Якщо користувач вводить "hello"
, програма виводить "How can I help you?"
. Якщо ж введена команда не відповідає жодному з цих варіантів, програма виводить "Invalid command."
.
Welcome to the assistant bot!
Enter a command: test
Invalid command.
Enter a command: hello
How can I help you?
Enter a command: exit
Good bye!
Цей код створює простий інтерактивний командний рядок, який реагує на обмежений набір команд. Ми реалізували цикл запит-відповідь, який буде служити відмінною основою для додавання функціональності в майбутніх домашніх завданнях.
Тепер додамо парсер команд. Перепишемо наш код наступним чином
def parse_input(user_input):
cmd, *args = user_input.split()
cmd = cmd.strip().lower()
return cmd, *args
def main():
print("Welcome to the assistant bot!")
while True:
user_input = input("Enter a command: ")
command, *args = parse_input(user_input)
if command in ["close", "exit"]:
print("Good bye!")
break
elif command == "hello":
print("How can I help you?")
else:
print("Invalid command.")
if __name__ == "__main__":
main()
Ми додали функцію parse_input(user_input)
яка приймає рядок вводу користувача user_input
і розбиває його на слова за допомогою методу split()
. Вона повертає перше слово як команду cmd
та решту як список аргументів *args
. Рядок коду cmd, *args = user_input.split()
розділяє рядок на слова. Перше слово зберігається у змінній cmd
, а решта зберігається у списку args
завдяки оператору розпакування *
. Далі рядок коду cmd = cmd.strip().lower()
видаляє зайві пробіли навколо команди та перетворює її на нижній регістр.
☝ Навіщо приводити команду до нижнього регістру?
Припустимо, користувач вводить команду як"HELLO"
,"Hello"
або"hello"
. Якщо не привести ці варіанти до спільного регістру, вони будуть розглядатися як різні команди, і вам доведеться обробляти кожний варіант окремо.
Приведення команди до нижнього регістру дозволяє уникнути цього, перетворюючи всі варіанти на одну та ту ж форму. Таким чином, ви можете легко порівнювати введену команду з попередньо визначеними командами без зважання на те, як користувач ввів її.
Це забезпечує кращий досвід користувача, оскільки програма стає менш чутливою до конкретного способу введення команд.
Отриманий результат в функції main
ми отримаємо після виконання рядка коду command, *args = parse_input(user_input)
.
Функція parse_input
розбиває введений рядок на слова, використовуючи пробіл як розділювач. Змінна command
отримує перше значення та вважається командою, а змінна args
стає списком з усіх інших значень.
Наприклад якщо ми введемо команду "add John 123456"
то змінна command
стане рядком "add"
а змінна args
стане списком ["John", "123456"]
. Якщо ж ми введемо команду "hello"
то command
стане рядком "hello"
, а args
буде пустим списком []
Маю надію ви вже зрозуміли тепер принцип парсера, настав час додати команду add
.
def parse_input(user_input):
cmd, *args = user_input.split()
cmd = cmd.strip().lower()
return cmd, *args
def add_contact(args, contacts):
name, phone = args
contacts[name] = phone
return "Contact added."
def main():
contacts = {}
print("Welcome to the assistant bot!")
while True:
user_input = input("Enter a command: ")
command, *args = parse_input(user_input)
if command in ["close", "exit"]:
print("Good bye!")
break
elif command == "hello":
print("How can I help you?")
elif command == "add":
print(add_contact(args, contacts))
else:
print("Invalid command.")
if __name__ == "__main__":
main()
Ми додали словник з контактами contacts = {}
в середину функції main
та функцію обробник команди add_contact
.
Функція add_contact
призначена для додавання нового контакту до словника контактів. Вона приймає два аргументи: args
, який є списком і містить ім'я та телефонний номер, та contacts
, який є словником, де зберігаються контакти.
Всередині функції, два елементи зі списку args
розпаковуються в змінні name
та phone
. Функція далі додає пару "ключ: значення" до словника контактів, використовуючи ім'я як ключ і телефонний номер як значення contacts[name] = phone
.
☝ Треба зауважити, що, якщо контакт з таким ім'ям вже існує, його дані будуть перезаписані без будь-яких попереджень. Тут ви вже можете діяти на свій розсуд, хочете чи ні ви обробляти колізію, в нашому варіанті ми перезаписуємо контакт.
Функція add_contact
повертає рядок, що підтверджує успішне додавання контакту: "Contact added."
.
Необхідно зауважити, що ця функція не має вбудованих перевірок на помилки введення. Наприклад, якщо args
не містить двох елементів, ця функція викличе помилку ValueError
.
ValueError: not enough values to unpack (expected 2, got 0)
Обробку помилок в цьому домашньому завданні залиште на свій розсуд, бо в наступному домашньому завданні ми додамо обробку помилок через декоратори.
"close"
або "exit"
."hello"
, та відповідає у консоль повідомленням "How can I help you?"
"add username phone"
. За цією командою бот зберігає у пам'яті, наприклад у словнику, новий контакт. Користувач вводить ім'я username
та номер телефону phone
, обов'язково через пробіл."change username phone"
. За цією командою бот зберігає в пам'яті новий номер телефону phone
для контакту username
, що вже існує в записнику."phone username"
За цією командою бот виводить у консоль номер телефону для зазначеного контакту username
."all"
. За цією командою бот виводить всі збереженні контакти з номерами телефонів у консоль."close"
, "exit"
за будь-якою з цих команд бот завершує свою роботу після того, як виведе у консоль повідомлення "Good bye!"
та завершить своє виконання.main
, всі print
та input
відбуваються тільки там.У вас є текстовий файл, який містить інформацію про котів. Кожен рядок файлу містить унікальний ідентифікатор кота, його ім'я та вік, розділені комою.
Наприклад:
60b90c1c13067a15887e1ae1,Tayson,3
60b90c2413067a15887e1ae2,Vika,1
60b90c2e13067a15887e1ae3,Barsik,2
60b90c3b13067a15887e1ae4,Simon,12
60b90c4613067a15887e1ae5,Tessi,5
Ваше завдання - розробити функцію get_cats_info(path)
, яка читає цей файл та повертає список словників з інформацією про кожного кота.
get_cats_info(path)
має приймати один аргумент - шлях до текстового файлу (path
).with
для безпечного читання файлу.split(',')
для отримання ідентифікатора, імені та віку кота.cats_info = get_cats_info("path/to/cats_file.txt")
print(cats_info)
Очікуваний результат:
[
{"id": "60b90c1c13067a15887e1ae1", "name": "Tayson", "age": "3"},
{"id": "60b90c2413067a15887e1ae2", "name": "Vika", "age": "1"},
{"id": "60b90c2e13067a15887e1ae3", "name": "Barsik", "age": "2"},
{"id": "60b90c3b13067a15887e1ae4", "name": "Simon", "age": "12"},
{"id": "60b90c4613067a15887e1ae5", "name": "Tessi", "age": "5"},
]
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.