Mark_mykraft
@Mark_mykraft

Нужна помощь в написании функций для чтения, записи файлов?

Есть файл contacts.txt со следующим содержанием
Name            Phone
John           123456
Jane           654321
Bob             +1234

Указания:
1.При запуске должен загружаться список контактов из файла.
2.При создании, изменении или удалении контакта файл должен полностью перезаписываться новыми данными.
3.Чтение и запись данных в файл должны выполняться в отдельных функциях.
4.Необходимо сделать проверку на наличие в имени контакта запятой - запретите добавление контакта, если этот символ присутствует в имени.
5. Все изменения требуется вносить в законченную версию программы(код программы ниже)
6. Добавьте сортировку контактов по алфавиту перед выводом списка контактов. Используйте метод списка sort или функцию sorted() и лямбда-выражение для сортировки.
with open("contacts.txt", 'r') as file:       #добавил функцию для открытия файла,
                                                            #но когда ищу контакт через find и ввожу имя Bob , пишет что такого контакта 
                                                            #нет, почему?
    print(file.read())
 
print("""Введите команду:
* list - вывести контакты
* find - найти контакт 
* add  - добавить контакт
* edit - изменить контакт 
* delete  - удалить контакт
* exit - выход""")
 
def list(contacts):
    print("{:<10}".format('Name'), f"{'Phone':>10}")
    for contact in contacts:
        print("{:<10}".format(contact['name']), "{:>10}".format(contact['phone']))
 
def find(contacts):
    print("Найти контакт:")
    name = input("> ")
    for contact in contacts:
        if contact['name'] == name:
            print(f"{contact['name']:<10}", "{:>10}".format(contact['phone']))
            break
        else:
            print("Контакт не найден")
 
def delete(contacts):
    print("Введите контакт: ")
    name = input('> ')
    for contact in contacts:
        if contact['name'] == name:
            print("Удалить контакт %s (YES/NO)?: " % name)
            name_del = input('> ')
            if name_del == "YES":
                contacts.remove(contact)
                print("Вы удалили контакт %s " % name)
 
def add(contacts):
    print("Введите имя контакта:")
    name = input("> ")
    print("Введите телефон контакта:")
    phone = input("> ")
    new_contact = {'name': name, 'phone': phone}
    contacts.append(new_contact)
    print("Контакт добавлен и сохранён")
def edit(contacts):
    print("Введите имя контакта: ")
    name = input("> ")
    for index, contact in enumerate(contacts):
        if contact['name'] == name:
            print("Введите новое имя контакта: ")
            new_name = input("> ")
            print("Введите новый телефон контакта: ")
            new_phone = input("> ")
            contact_update = {
                'name': new_name,
                'phone': new_phone
            }
            contacts[index] = contact_update
            index = -1
            break
    if index == -1:
        print("Контакт изменен")
    else:
        print("Контакт не найден")
while True:
    print("\nВведите команду: ")
    command = input('> ')
    if command == 'list':
        list(contacts)
    elif command == 'find':
        find(contacts)
    elif command == 'add':
        add(contacts)
    elif command == 'edit':
        edit(contacts)
    elif command == 'delete':
        delete(contacts)
    elif command == 'exit':
        break
    else:
        print("Такой команды нет")
  • Вопрос задан
  • 76 просмотров
Пригласить эксперта
Ответы на вопрос 1
phaggi
@phaggi Куратор тега Python
лужу, паяю, ЭВМы починяю
Ответ короткий: потому, что вы плохо знаете python. Из рук вон плохо. Инструмент сложный, и его надо изучать.
Ответ длинный:
  1. приведенный код либо неправильно построен в части отступов, либо побился, его надо заново вставить внутрь тегов code.
  2. в коде вы переопределяете некоторые имена, которые являются встроенными функциями Python или методами некоторых встроенных классов, например file, list, add и т.п.
    Так делать не рекомендуется,
    точнее, в вашем случае не рекомендуется
    если вы не делаете это осмысленно, понимая, что вы именно переопределяете и именно встроенную функцию, и понимаете глубокий смысл и последствия. Короче, не делайте так.
    (В данном случае add не ломается, но все равно не надо. Выбирайте имена переменных более уникальные. Хотя бы command_edit, command_list и т.п.
  3. Вы открываете файл, но дальне ничего с ним не делаете. Почему-то в вашем коде предполагается, что текстовый файл при открытии волшебным образом превращается в contacts, который вроде как список словарей или что-то в таком роде (какую-то разновидность JSON?) Но он в коде не превращается ни во что, даже в тыкву. Переменная contacts, которая по-идее должна содержать в себе вышеназванную структуру, не определена в коде.


Кроме того, вы не читаете документацию, в т.ч. этого ресурса, где задаете вопросы. Формулировать название вопроса надо в соответствии с правилами построения вопросительных предложений, а не пихнуть в конце вопрос, чтобы система отстала.

Писать за вас тут решение вашей задачи никто не будет; а если таки найдется кто-то, то поверьте, они преднамеренно напишут так, что работать будет, но вы не поймете, и при случае не сможете ни поправить, ни объяснить кому-либо (преподавателю особенно).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы