为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕哥9229398 2023-03-16 15:26:18
如果我的问题是正确的,请告诉我上下文:这个函数 view_mine(),需要能够列出当前登录的用户的任务。它从一个task.txt中读取信息,检查一开始(登录)输入的用户名是否与txt中对应的任务匹配,然后打印出来(我已经这样做了)该功能还必须让用户能够选择由用户输入显示的任务编号分配给他们的任务。仅当任务未完成时,才应允许用户编辑任务。主要有两个修改: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 日,否
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超12个赞

更新文件时,更安全的方法是创建一个临时文件,您可以在其中写入内容,同时保持原始文件的安全和不受影响。然后,写入过程完成后,您可以删除原始文件并重命名临时文件。


另外,我认为您应该有某种唯一 ID 来标识每个任务。我不得不使用行号来识别它们,但如果包含一些不可变的 ID 会更好。


最后,我建议您在获取任务时使用字典而不是列表。它允许您更轻松地访问和更新字段。


(在下面的例子中,我没有包括所有的菜单选项,我只包括了用户名编辑来说明它应该如何工作)


import os

from pprint import pprint


# The view_mine function should receive the username as a parameter

def 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')


查看完整回答
反对 回复 2023-03-16
  • 1 回答
  • 0 关注
  • 56 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信