Python:创建/写入文件直到循环结束

Python:创建/写入文件直到循环结束,python,python-3.x,list,Python,Python 3.x,List,我试图使用Python将用户输入的所有输入保存在文本文件中。我想确保输入的所有输入都存储在文件中,直到我完全退出程序,在这种情况下,直到我按“回车”停止列表。我还需要检查输入名称,看看它是否与前面的任何条目匹配 我的程序现在的问题是,当我退出代码时,文本文件会更新输入的最新名称。我需要我的程序将所有这些名字保存在一个列表中,直到程序结束,因为我必须确保没有重复的名字。我必须警告用户该名称已经存在,我还需要帮助。我在下面的代码中创建了一个单独的函数,用于根据输入创建和编写文本文件,但我也注意到我可

我试图使用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()
def get_people():
打印(“列出姓名或退出”)
尽管如此:
尝试:
用户输入=输入(“名称:”)
如果len(用户输入)>25:
升值误差
elif用户_输入=='':
一无所获
其他:
输入文件='listofnames.txt'
打开(输入_文件“a”)作为文件:
file.write(用户输入+'\n')
返回用户输入
除值错误外:
打印(“ValueError!”)
#文件中的定义名称(用户输入):
#输入文件='listofnames.txt'
#打开(输入_文件,'w')作为文件:
#file.write(用户输入+'\n')
#返回用户输入
def main():
尽管如此:
尝试:
用户输入=获取人员()
#文件中的名称(用户输入)
如果用户输入=无:
打破
除值错误外:
打印(“ValueError!”)
main()

问题在于代码打开文件的方式:

with open(input_file, 'w') as file:
检查手册-由于
“w”
,代码会每隔
open()
一次覆盖文件。它需要打开它以附加
“a”

如果文件不存在,则追加将创建该文件,或者追加到任何同名的现有文件的末尾

编辑:要检查您是否已经看到该姓名,请将“已看到”姓名列表传递给
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()
def get_people(已使用):
打印(“列出姓名或退出”)
尽管如此:
尝试:
用户输入=输入(“名称:”)
lower_name=user_input.strip().lower()
如果len(用户输入)>25:
升值误差
elif已使用中的较低\u名称:
打印(“该名称已被使用”)
elif用户_输入=='':
一无所获
其他:
已使用。追加(较低的\u名称)
输入文件='listofnames.txt'
打开(输入_文件“a”)作为文件:
file.write(用户输入+'\n')
返回用户输入
除值错误外:
打印(“ValueError!”)
def main():
已使用=[]
尽管如此:
尝试:
用户输入=获取用户(已使用)
#文件中的名称(用户输入)
如果用户输入=无:
打破
除值错误外:
打印(“ValueError!”)
main()

如果我正确理解了你的问题,我会说。 您可以读取文件并将所有行放入列表中,然后可以检查输入是否已经存在。在这里,我对您的代码进行了一些编辑

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()
def get_人(姓名列表):
打印(“列出姓名或退出”)
尽管如此:
尝试:
用户输入=输入(“名称:”)
write_line=用户输入+'\n'
如果在名称列表中写入行:
打印('已存在..!')
升值误差
name\u list.append(写入行)
如果len(用户输入)>25:
升值误差
elif用户_输入=='':
一无所获
其他:
输入文件='listofnames.txt'
打开(输入_文件“a”)作为文件:
file.write(写入行)
返回用户输入
除值错误外:
打印(“ValueError!”)
def main():
name_list=[]
f=打开(“listofnames.txt”)
name_list=f.readlines()
尽管如此:
尝试:
用户输入=获取人员(姓名列表)
#文件中的名称(用户输入)
如果用户输入=无:
打破
除值错误外:
打印(“ValueError!”)
main()

这与问题有什么关系?@Barmar-在
get_people()
循环中循环的每次迭代都会覆盖现有文件,因此只留下与OP的问题描述相匹配的姓氏。这个问题让我困惑,我认为他的问题是,在他退出程序之前,没有任何东西被写入文件。我认为这与刷新有关,直到我更仔细地检查了代码。@Kingsley'a'可以工作,但在我完全退出程序之前,它不会在每次输入时更新txt。我必须检查以确保没有重复的名字。我不明白这个问题。由于您将
一起使用以打开文件,因此在写入文件后,该文件将立即关闭。这会将数据刷新到文件中,您不必等到程序退出。@Barmar我修复了“with”行。我现在的问题是每当用户输入名称时都会更新该文件,因为我需要确保在用户之前列出名称时警告用户。我试图避免重复输入。您可能希望在输入循环运行时存储输入
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()