Python如何删除文本文件中的特定行?

2024-06-16 10:38:32 发布

您现在位置:Python中文网/ 问答频道 /正文

现在我有一个文本文件,格式如下:

ID1 - Reason for ban
ID2 - Reason for ban
ID3 - Reason for ban

我有一个命令,基本上删除了用户的禁令,应该删除文本文件中的用户详细信息

ID2 = 12345 #sample ID
with open("yourfile.txt", "r") as f:
  lines = f.readlines()
with open("yourfile.txt", "w") as f:
  for line in lines:
    ID, reason = line.split(" - ")
    if ID == ID2:
      f.write("\n")    
          

无论ID是否匹配,上面的代码都会删除所有内容,是否有其他解决方案可以检测文本文件中的ID是否与用户请求匹配


Tags: 用户txtidforas格式withline
3条回答

你的代码没有写出你想要保留的好代码行。在ID匹配的情况下,只有一个“\n”。但ID永远不会匹配,因为您将整数与字符串进行比较,所以它总是空的。因为您的计划是写一个空行来代替未标注的ID,所以当您尝试ID, reason = line.split(" - ")时,将来的运行将失败

相反,您可以在行的前面构建一个匹配的字符串并避免异常。最好先写入一个临时文件,而不要因为编程错误而导致整个文件被删除

import os

ID2 = 12345 #sample ID
unban_id = f"{ID2} - "

with open("yourfile.txt", "r") as f:
    lines = r.readlines()
with open("yourfile.txt.tmp", "w") as out:i
    f.writelines(line if line.startswith(unban_id) else "\n" for line in lines)
os.rename("yourfile.txt.tmp", "yourfile.txt")

您没有重写原始文件。只是加了一行

使用此选项添加其余部分:

ID2 = 12345  # sample ID
with open("yourfile.txt", "r") as f:
    lines = f.readlines()

with open("yourfile.txt", "w") as f:
    for line in lines:
        ID, reason = line.split(" - ")
        if ID == ID2:
            f.write("\n")
        else:
            f.write(line)

或使用:

if ID != ID2:
    f.write(line)

如果不想在旧行所在的位置创建空行

除了else:块之外,为了能够比较ID,需要将ID2作为字符串,或者需要将从文件中提取的ID转换为int

以下是带有字符串的版本:

ID2 = '12345' #sample ID

with open("test.txt", "r") as f:
    lines = f.readlines()

with open("yourfile.txt", "w") as f:
    for line in lines:
        ID, *rest = line.strip().split()

        if ID == ID2:
            f.write("\n")
        else:
            f.write(line)

如果单个if语句中的ID不相等,您可以跳过if-else,只需编写一行文本,除非您需要换行符,即空行

关于行分割,我个人总是使用strip()来去除任何前导和尾随空格。此外,按空格分割也有其好处,您不需要考虑ID和-之间是否存在意外的制表符。因此,在这里,您拆分它并提取ID和“rest”,字面上标记为*rest,因为您无论如何都不需要它

相关问题 更多 >