Python删除文本文件指定行异常求助:按CustID删记录出错
问题分析与解决方案
嘿,我一眼就看出问题所在了——你的代码现在用的是包含性判断来筛选要保留的行,这就是为什么输入4时,所有带数字4的行都被误删了,哪怕它们的CustID并不是4。
核心问题
你当前的判断逻辑是:
if searchID not in line: f.write(line)
这意味着只要某一行的任意位置包含你输入的字符串(比如4),这行就会被跳过不写入(也就是被删除)。比如如果有个客户的CustID是14,或者电话号码里有4,这行都会被误删。你需要的是精确匹配CustID字段,而不是整行包含。
修复后的代码
修改循环里的判断逻辑,先拆分每行的字段,精确对比CustID:
def deleteCustomer(login): print("\n***********\n Delete a customer\n*************\n") with open ("customers.txt") as f: print("CustID\t Name \t\t\t Customer Town \t Customer Tel Number") for row in f: field = row.split(",") custID = field[0] custFName = field[1] custLName = field[2] custTown = field[3] custTelNum = field[4].strip() # 去掉换行符,避免打印多余空行 print(custID,"\t" ,custFName,custLName,"\t\t" ,custTown,"\t" ,custTelNum) while True: searchID = input("Please enter the CustID you wish to delete :") # 先读取所有行 with open ("customers.txt","r") as f: new_f = f.readlines() # 重新写入文件,只保留CustID不匹配的行 with open ("customers.txt","w") as f: for line in new_f: line_stripped = line.strip() if not line_stripped: # 跳过空行,避免无效内容 continue fields = line_stripped.split(",") # 精确匹配CustID字段,不相等才写入 if fields[0] != searchID: f.write(line) sleep(2) viewCustomers(login) # 增加退出循环的选项,避免无限执行 cont = input("Do you want to delete another customer? (y/n): ") if cont.lower() != 'y': break
关键修改点
- 精确匹配字段:把每行拆分成字段后,只对比第一个字段(CustID)和用户输入的
searchID,只有当两者不相等时才写入该行,彻底避免误删。 - 拆分读写操作:将读文件和写文件分成两个独立的
with块,避免r+模式下的指针位置混乱,逻辑更清晰易懂。 - 处理空行与格式:跳过空行,同时清理电话号码字段的换行符,让打印输出更整洁。
- 增加退出选项:原来的
while True会无限循环删除流程,加个询问让用户可以自主退出。
这样修改后,输入4就只会删除CustID正好是4的那条记录,其他包含数字4的行都会被正常保留下来啦。
内容的提问来源于stack exchange,提问作者Neos Nokia
相关产品推荐
相关产品推荐

