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
相关产品推荐
相关产品推荐

