Python删除文本文件自定义内容:代码无报错但未删除目标行
问题分析与修复方案
我来帮你看看问题出在哪~你的代码逻辑有几个关键的小错误,导致删除功能没生效:
核心问题点
- 错误拆分联系人名称:
to_Delete=list(contact_to_delete)会把输入的名字拆成单个字符的列表(比如输入"Bob"会变成['B','o','b']),这完全不是你想要的匹配目标,应该直接使用输入的字符串。 - 遍历字符而非行:
content = file.read()把整个文件读成一个字符串,for line in content是逐个遍历字符,而不是逐行处理联系人数据,这就导致你根本没在操作每一行的联系人信息。 - 逻辑判断混乱:
if not any(line in line for line in to_Delete)里的变量名重复(两个line),而且逻辑完全错误,既没正确匹配联系人名称,也没筛选出要保留的行。 - 文件写入方式错误:用
r+模式打开文件后,直接写入会追加到文件末尾,而且原内容还在,应该先收集所有需要保留的行,再覆盖写入文件。
修复后的代码
def Delete_con(): contact_to_delete = input("Enter the name to delete from contacts: ") # 收集所有需要保留的行 lines_to_keep = [] with open("phonebook1.txt", "r") as file: # 逐行读取文件 for line in file.readlines(): # 检查当前行是否不包含要删除的联系人名称(可根据实际格式调整匹配逻辑,比如startswith) if contact_to_delete not in line.strip(): lines_to_keep.append(line) # 将保留的行写回文件,覆盖原内容 with open("phonebook1.txt", "w") as file: file.writelines(lines_to_keep) print(f"Contact '{contact_to_delete}' has been deleted successfully!")
代码说明
- 直接使用输入的
contact_to_delete字符串作为匹配目标,不需要转成列表。 - 用
readlines()逐行读取文件内容,确保每一次循环处理的是一个联系人的行数据。 - 通过
contact_to_delete not in line.strip()筛选出不包含目标名称的行(如果你的通讯录每行格式是姓名:电话号码,也可以用not line.startswith(contact_to_delete + ":")来更精准匹配)。 - 先读取并筛选要保留的行,再用
w模式打开文件覆盖写入,这样就能彻底删除目标行。
内容的提问来源于stack exchange,提问作者Franky Padilla




