Created
February 28, 2023 17:56
-
-
Save bannovGB/aafdc0b0ae29325a12da36a190b270e9 to your computer and use it in GitHub Desktop.
Python_lesson08
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"""Создать телефонный справочник с возможностью импорта и экспорта данных в формате .txt. | |
Фамилия, имя, отчество, номер телефона - данные, которые должны находиться в файле. | |
1. Программа должна выводить данные | |
2. Программа должна сохранять данные в текстовом файле | |
3. Пользователь может ввести одну из характеристик для поиска определенной записи(Например имя или фамилию человека) | |
4. Использование функций. Ваша программа не должна быть линейной """ | |
def choose_action(phonebook): | |
while True: | |
print('Что вы хотите сделать?') | |
user_choice = input('1 - Импортировать данные\n2 - Найти контакт\n3 - Добавить контакт\n\ | |
4 - Изменить контакт\n5 - Удалить контакт\n6 - Просмотреть все контакты\n0 - Выйти из приложения\n') | |
print() | |
if user_choice == '1': | |
file_to_add = input('Введите название импортируемого файла: ') | |
import_data(file_to_add, phonebook) | |
elif user_choice == '2': | |
contact_list = read_file_to_dict(phonebook) | |
find_number(contact_list) | |
elif user_choice == '3': | |
add_phone_number(phonebook) | |
elif user_choice == '4': | |
change_phone_number(phonebook) | |
elif user_choice == '5': | |
delete_contact(phonebook) | |
elif user_choice == '6': | |
show_phonebook(phonebook) | |
elif user_choice == '0': | |
print('До свидания!') | |
break | |
else: | |
print('Неправильно выбрана команда!') | |
print() | |
continue | |
def import_data(file_to_add, phonebook): | |
try: | |
with open(file_to_add, 'r', encoding='utf-8') as new_contacts, open(phonebook, 'a', encoding='utf-8') as file: | |
contacts_to_add = new_contacts.readlines() | |
file.writelines(contacts_to_add) | |
except FileNotFoundError: | |
print(f'{file_to_add} не найден') | |
def read_file_to_dict(file_name): | |
with open(file_name, 'r', encoding='utf-8') as file: | |
lines = file.readlines() | |
headers = ['Фамилия', 'Имя', 'Номер телефона'] | |
contact_list = [] | |
for line in lines: | |
line = line.strip().split() | |
contact_list.append(dict(zip(headers, line))) | |
return contact_list | |
def read_file_to_list(file_name): | |
with open(file_name, 'r', encoding='utf-8') as file: | |
contact_list = [] | |
for line in file.readlines(): | |
contact_list.append(line.split()) | |
return contact_list | |
def search_parameters(): | |
print('По какому полю выполнить поиск?') | |
search_field = input('1 - по фамилии\n2 - по имени\n3 - по номеру телефона\n') | |
print() | |
search_value = None | |
if search_field == '1': | |
search_value = input('Введите фамилию для поиска: ') | |
print() | |
elif search_field == '2': | |
search_value = input('Введите имя для поиска: ') | |
print() | |
elif search_field == '3': | |
search_value = input('Введите номер для поиска: ') | |
print() | |
return search_field, search_value | |
def find_number(contact_list): | |
search_field, search_value = search_parameters() | |
search_value_dict = {'1': 'Фамилия', '2': 'Имя', '3': 'Номер телефона'} | |
found_contacts = [] | |
for contact in contact_list: | |
if contact[search_value_dict[search_field]] == search_value: | |
found_contacts.append(contact) | |
if len(found_contacts) == 0: | |
print('Контакт не найден!') | |
else: | |
print_contacts(found_contacts) | |
print() | |
def get_new_number(): | |
last_name = input('Введите фамилию: ') | |
first_name = input('Введите имя: ') | |
phone_number = input('Введите номер телефона: ') | |
return last_name, first_name, phone_number | |
def add_phone_number(file_name): | |
info = ' '.join(get_new_number()) | |
with open(file_name, 'a', encoding='utf-8') as file: | |
file.write(f'{info}\n') | |
def show_phonebook(file_name): | |
list_of_contacts = sorted(read_file_to_dict(file_name), key=lambda x: x['Фамилия']) | |
print_contacts(list_of_contacts) | |
print() | |
return list_of_contacts | |
def search_to_modify(contact_list: list): | |
search_field, search_value = search_parameters() | |
search_result = [] | |
for contact in contact_list: | |
if contact[int(search_field) - 1] == search_value: | |
search_result.append(contact) | |
if len(search_result) == 1: | |
return search_result[0] | |
elif len(search_result) > 1: | |
print('Найдено несколько контактов') | |
for i in range(len(search_result)): | |
print(f'{i + 1} - {search_result[i]}') | |
num_count = int(input('Выберите номер контакта, который нужно изменить/удалить: ')) | |
return search_result[num_count - 1] | |
else: | |
print('Контакт не найден') | |
print() | |
def change_phone_number(file_name): | |
contact_list = read_file_to_list(file_name) | |
number_to_change = search_to_modify(contact_list) | |
contact_list.remove(number_to_change) | |
print('Какое поле вы хотите изменить?') | |
field = input('1 - Фамилия\n2 - Имя\n3 - Номер телефона\n') | |
if field == '1': | |
number_to_change[0] = input('Введите фамилию: ') | |
elif field == '2': | |
number_to_change[1] = input('Введите имя: ') | |
elif field == '3': | |
number_to_change[2] = input('Введите номер телефона: ') | |
contact_list.append(number_to_change) | |
with open(file_name, 'w', encoding='utf-8') as file: | |
for contact in contact_list: | |
line = ' '.join(contact) + '\n' | |
file.write(line) | |
def delete_contact(file_name): | |
contact_list = read_file_to_list(file_name) | |
number_to_change = search_to_modify(contact_list) | |
contact_list.remove(number_to_change) | |
with open(file_name, 'w', encoding='utf-8') as file: | |
for contact in contact_list: | |
line = ' '.join(contact) + '\n' | |
file.write(line) | |
def print_contacts(contact_list: list): | |
for contact in contact_list: | |
for key, value in contact.items(): | |
print(f'{key}: {value:12}', end='') | |
print() | |
if __name__ == '__main__': | |
file = 'Phonebook.txt' | |
choose_action(file) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment