【问题标题】:How to remove a specific line that contains a specific string? [duplicate]如何删除包含特定字符串的特定行? [复制]
【发布时间】:2021-03-17 10:12:15
【问题描述】:

我根据我在网上找到的代码自己尝试了一些代码,但似乎没有一个有效。

文本文件包含如下内容:

Student ID: 1230345

Course code:FHCT1024
Grade: A
GPA: 4.0000

CGPA :4.0000

我想删除其中包含字符串'CGPA' 的行。我尝试使用:

with open("file.txt", 'r') as inp, open("file.txt", 'w') as f:
    for line in inp:
        if line.strip().startswith("CGPA"):
            pass
        else:
            f.write(line)

但这删除了一切。

【问题讨论】:

  • 以'w' 模式打开文件会破坏现有内容。
  • 您不能同时(轻松地)读取和写入文件。要么将结果写入临时文件并在删除原始文件后重命名,要么将结果存储在内存中并在之后重写原始文件。

标签: python


【解决方案1】:

您可以在读取文件时过滤行

res = []

with open("file.txt", 'r') as inp:
            for line in inp:
                if line.strip().startswith("CGPA"):
                    pass
                else:
                    res += [line]

res 将包含所有不以“CGPA”开头的lines。

一旦你有 res ,你可以根据需要将它写入文件

【讨论】:

    【解决方案2】:

    让我们以附加模式('a')打开:

    with open("file.txt", 'r') as inp, open("file.txt", 'a') as f:
                for line in inp:
                    if line.strip().startswith("CGPA"):
                        pass
                    else:
                        f.write(line)
    

    【讨论】:

    • 这附加了没有 CGPA 行的文本,所以如果它处于写入模式,它会起作用,我想谢谢。
    【解决方案3】:

    所以问题是您正在读取您正在写入的同一个文件,这可能会导致问题,因为当您读取文件时,数据会发生变化并且是动态的。然后您可以尝试以不同的方式命名您正在写入的文件。在这里,您有一个名为 file.txt 的输入文件。然后将输出文件命名为“fileoutput.txt”。

    您还可以搜索不同的打开文件模式,例如“+r”和其他可以简化此过程的文件。

    但这应该可行:

    with open("file.txt", 'r') as inp, open("fileoutput.txt", 'w') as f:
                for line in inp:
                    if line.strip().startswith("CGPA"):
                        pass
                    else:
                        f.write(line)
    

    【讨论】:

      【解决方案4】:
      text='''Student ID: 1230345
      
      Course code:FHCT1024
      Grade: A
      GPA: 4.0000
      
      CGPA :4.0000'''
      
      text_ls=text.splitlines()
      
      for i in range(len(text_ls[:])):
          if text_ls[i].startswith('CGPA'):
              text_ls.remove(text_ls[i])
      print('\n'.join(text_ls))
      

      【讨论】:

      • 是的,这给出了一个清晰的概念,谢谢伙计
      【解决方案5】:

      如果您的程序的唯一目的是删除以CGPA 开头的行,我建议您查看sed 命令。

      sed '/^CGPA/d' file.txt
      

      这要快得多,并且需要更少的代码行数。

      【讨论】:

      • 我会看看 sed 谢谢
      【解决方案6】:

      如果你需要读取、更新、然后写入;我建议将其分解为两个不同的open 上下文管理器:一个用于读取,一个用于写入,因为平面比嵌套更容易理解。此外,您可能希望写入不同的文件以保留原始文件。

      lines_without_cgpa = []
      
      with open("file.txt", 'r') as f:
          for line in f.readlines():
              if "CGPA" not in line and "" != line:
                  lines_without_cgpa.append(line)
      
      print(lines_without_cgpa)
      
      with open("file_without_cgpa.txt", 'w') as f:
          f.writelines(lines_without_cgpa)
      

      【讨论】:

        猜你喜欢
        • 2020-08-22
        • 1970-01-01
        • 2016-01-05
        • 2011-02-25
        • 2020-02-04
        • 1970-01-01
        • 1970-01-01
        • 2020-09-27
        • 1970-01-01
        相关资源
        最近更新 更多