Python: создание / запись файлов до конца цикла - PullRequest
0 голосов
/ 28 февраля 2019

Я пытаюсь сохранить все входные данные, введенные пользователем, в текстовый файл с использованием Python.Я хочу убедиться, что все введенные данные сохранены в файле до тех пор, пока я полностью не выйду из программы, в этом случае, пока я не нажму «ввод», чтобы остановить список.Мне также нужно проверить имена входных данных и посмотреть, соответствует ли оно какой-либо из предыдущих записей.

Проблема с моей программой сейчас заключается в том, что текстовый файл обновляет последние введенные имена, когда я выхожу из кода.Мне нужна моя программа, чтобы сохранить все эти имена в списке, пока программа не закончилась, потому что я должен сделать так, чтобы не было дубликатов.Я должен предупредить пользователя, что имя уже существует, и мне тоже нужна помощь.Я сделал отдельную функцию для создания и записи текстовых файлов из моих входных данных в моем коде ниже, но я также заметил, что могу реализовать это в функции get_people ().Я не уверен, что лучшая стратегия - создать для нее новую функцию или нет.Определенно что-то не так с записью файлов.

Текстовый файл должен иметь следующий формат:

Taylor

Selena

Martha

Chris

Вот мой код ниже:

def get_people():
    print("List names or <enter> to exit")
    while True:
        try:
            user_input = input("Name: ")
            if len(user_input) > 25:
                raise ValueError
            elif user_input == '':
                return None
            else:
                input_file = 'listofnames.txt'
                with open(input_file, 'a') as file:
                    file.write(user_input + '\n')
                return user_input

        except ValueError:
            print("ValueError! ")


# def name_in_file(user_input):
#     input_file = 'listofnames.txt'
#     with open(input_file, 'w') as file:
#             file.write(user_input + '\n')
#     return user_input


def main():
    while True:
    try:
        user_input = get_people()
        # name_in_file(user_input)
        if user_input == None:
            break

    except ValueError:
        print("ValueError! ")

main()

Ответы [ 2 ]

0 голосов
/ 28 февраля 2019

Если бы я правильно понял ваш вопрос, я бы сказал.Вы можете прочитать файл и поместить все строки в список, а затем проверить, существует ли уже ввод или нет.здесь я немного отредактировал твой код.

def get_people(name_list):
    print("List names or <enter> to exit")

    while True:
        try:
            user_input = input("Name: ")
            write_line = user_input + '\n'

            if write_line in name_list:
                print('already exist..!')
                raise ValueError
            name_list.append(write_line)

            if len(user_input) > 25:
                raise ValueError
            elif user_input == '':
                return None
            else:
                input_file = 'listofnames.txt'
                with open(input_file, 'a') as file:
                    file.write(write_line)
                return user_input

        except ValueError:
            print("ValueError! ")


def main():

    name_list = []
    f = open("listofnames.txt")
    name_list = f.readlines()

    while True:
        try:
            user_input = get_people(name_list)
            # name_in_file(user_input)
            if user_input == None:
                break

        except ValueError:
            print("ValueError! ")

main()
0 голосов
/ 28 февраля 2019

Проблема в том, как код открывает файл:

with open(input_file, 'w') as file:

Проверка руководства - https://docs.python.org/3.7/library/functions.html?highlight=open#open код перезаписывает файл каждые open() из-за "w".Он должен открыть его для добавления "a":

with open(input_file, 'a') as file:

При добавлении файл будет создан, если он не существует, или добавлен в конец любого существующего файла с таким же именем.

РЕДАКТИРОВАТЬ: Чтобы проверить, видели ли вы уже имя, передайте список "уже увиденных" имен в функцию get_people() и добавьте любое новое имя в этот список.

def get_people( already_used ):
    print("List names or <enter> to exit")
    while True:
        try:
            user_input = input("Name: ")
            lower_name = user_input.strip().lower()
            if len(user_input) > 25:
                raise ValueError
            elif lower_name in already_used:
                print("That Name has been used already")
            elif user_input == '':
                return None
            else:
                already_used.append( lower_name )
                input_file = 'listofnames.txt'
                with open(input_file, 'a') as file:
                    file.write(user_input + '\n')
                return user_input

        except ValueError:
            print("ValueError! ")

def main():
    already_used = []
    while True:
        try:
            user_input = get_people( already_used )
            # name_in_file(user_input)
            if user_input == None:
                break

        except ValueError:
            print("ValueError! ")

main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...