如何读取文本文件中的项目并根据用户的输入覆盖它

如果我的问题是正确的,请告诉我上下文:这个函数 view_mine(),需要能够

  1. 列出当前登录的用户的任务。它从一个task.txt中读取信息,检查一开始(登录)输入的用户名是否与txt中对应的任务匹配,然后打印出来(我已经这样做了)

  2. 该功能还必须让用户能够选择由用户输入显示的任务编号分配给他们的任务。仅当任务未完成时,才应允许用户编辑任务。主要有两个修改:

2.1. 编辑任务 2.1.1。用户名更改——更改用户名并将新用户名写入task.txt文件 2.1.2。截止日期更改 - 同上

2.2. 将任务标记为完成 - 将“否”更改为“是”

从第 2 点开始,我有点设法做到了,但我无法做的是完成 txt 中的任务并覆盖已编辑的内容。

如何让我的程序通过将给定的任务编号与 txt 中的行匹配来识别任务,然后替换用户想要替换的内容并覆盖 txt。

如果给定的 txt 是:

管理员,使用 taskManager.py 注册用户,使用 taskManager.py 为将使用该程序的所有团队成员添加用户名和密码。,2019 年 10 月 10 日,2019 年 10 月 20 日,无管理员,分配初始任务,使用 taskManager.py为每个团队成员分配适当的任务,2019 年 10 月 10 日,2019 年 10 月 25 日,否

我想将第一行任务 1 的用户名编辑为 john。之后应该是这样的

约翰,使用 taskManager.py 注册用户,使用 taskManager.py 为将使用该程序的所有团队成员添加用户名和密码。,2019 年 10 月 10 日,2019 年 10 月 20 日,无管理员,分配初始任务,使用 taskManager.py为每个团队成员分配适当的任务,2019 年 10 月 10 日,2019 年 10 月 25 日,否


慕哥9229398
浏览 68回答 1
1回答

红颜莎娜

更新文件时,更安全的方法是创建一个临时文件,您可以在其中写入内容,同时保持原始文件的安全和不受影响。然后,写入过程完成后,您可以删除原始文件并重命名临时文件。另外,我认为您应该有某种唯一 ID 来标识每个任务。我不得不使用行号来识别它们,但如果包含一些不可变的 ID 会更好。最后,我建议您在获取任务时使用字典而不是列表。它允许您更轻松地访问和更新字段。(在下面的例子中,我没有包括所有的菜单选项,我只包括了用户名编辑来说明它应该如何工作)import osfrom pprint import pprint# The view_mine function should receive the username as a parameterdef view_mine(username):    tasks = []    i = 0    with open('tasks.txt') as f:        lines = f.read().splitlines()    for db_row, line in enumerate(lines):        assigned_to, *rest = line.split(', ')        if username == assigned_to:            # use a dictionary to easily refer to the taks' fields            data = {k: v for k, v in zip(                ('number', 'db_row', 'assigned_to', 'title', 'description',                 'due_date', 'date_assigned', 'completed'),                (i + 1, db_row, assigned_to, *rest))}            tasks.append(data)            i += 1    # You can customize what you want to print, I just used pprint as a shortcut for this example    pprint(tasks)    task_num = int(input("Please select Task Number you would like to edit: "))    # Get specific task at given index    task = tasks[task_num - 1]    edit_option = input('''Would you like to:                                   e - edit task                                   c - mark complete                                   -1- return to main menu\n''')    if edit_option == 'e':        # This is how you would refer to the fields        if task['completed'] == 'No':            edit = input('''What would you like to edit:                                             u - username                                             d - due date\n''')            if edit == "u":                        # updating a field                        task['assigned_to'] = input("Please input new user: ")    # Actual file update part    fetched_rows = [task['db_row'] for task in tasks]    with open('tasks.txt') as f, open('temp.txt', 'w') as t:        for db_row, line in enumerate(f):            if db_row in fetched_rows:                fetched_rows.remove(db_row)                print(', '.join(v for k, v in list(tasks.pop(0).items())[2:]), file=t)            else:                print(line.strip(), file=t)        os.remove('tasks.txt')    os.rename('temp.txt', 'tasks.txt')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python