You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python待办事项列表删除文本文件行功能失效问题排查

待办事项列表删除功能修复方案

问题分析

你的删除逻辑存在几个关键问题:

  • 第一次用r+模式打开list.txt时,循环打印完所有行后,文件指针已经移到文件末尾,这时调用f.readlines()只会得到空列表,根本没读到文件内容。
  • 第二次用r+模式同时读写文件逻辑混乱:r+模式下写入会从当前指针位置开始覆盖内容,你读取一行就写入一行,等于把原内容又写了一遍,完全没实现删除效果。
  • 文件里的每行都带有换行符\n(最后一行可能没有),但你输入的待删除内容不带换行符,导致line != r永远为真,所有内容都会被保留下来。

修复后的代码

把删除逻辑改成先读取所有内容,过滤掉要删除的项,再重新写入文件:

print("Welcome to the to do list!")
ch1 = input(" Do you want to remove/add/read answer with(see , add , remove )")
if ch1 == "see":
    with open("list.txt") as a:
        for line in a:
            # 去掉换行符,避免打印多余空行
            print(line.strip())
elif ch1 == "add":
    with open("list.txt", "a+") as f:
        wr = input("What do you want to add to the list?")
        # 判断文件是否为空,避免开头出现空行
        f.seek(0)
        if not f.read():
            f.write(wr)
        else:
            f.write('\n' + wr)
elif ch1 == "remove":
    # 先读取所有待办项
    with open("list.txt", "r") as f:
        lines = f.readlines()
        # 打印时带行号,方便用户选择
        for idx, line in enumerate(lines, 1):
            print(f"{idx}. {line.strip()}")
        r = input("Which item do you want to remove? (输入内容或行号)")
    
    # 过滤掉要删除的项
    filtered_lines = []
    for line in lines:
        # 同时支持按内容或行号删除
        if line.strip() != r and str(lines.index(line)+1) != r:
            filtered_lines.append(line)
    
    # 重新写入文件
    with open("list.txt", "w") as s:
        s.writelines(filtered_lines)
else:
    print("Invalid mode")

关键修复点

  • 读取文件用单独的r模式,确保一次性读到所有行,不会因为指针位置问题读空。
  • 删除时用w模式重新写入,彻底清空原文件后写入过滤后的内容,避免读写冲突。
  • 用strip()处理换行符,让用户输入的内容和文件里的行能正确对比。
  • 额外支持按行号删除,更符合日常使用习惯(用户大概率想输入行号而非完整内容)。

内容的提问来源于stack exchange,提问作者Samy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 04:00:01