【问题标题】:Remove lines from a text file which do not contain a certain string with python使用python从文本文件中删除不包含特定字符串的行
【发布时间】:2010-11-30 04:56:09
【问题描述】:

我正在尝试在日志文件中形成特定用户名的引号文件。如何删除其中不包含特定用户名的每一行?或者如何将包含此用户名的所有行写入新文件?

【问题讨论】:

    标签: python string text file-io file


    【解决方案1】:
    with open('input.txt', 'r') as rfp:
      with open('output.txt', 'w') as wfp:
        for line in rfp:
          if ilikethis(line):
            wfp.write(line)
    

    【讨论】:

      【解决方案2】:
      with open(logfile) as f_in:
          lines = [l for l in f_in if username in l]
      with open(outfile, 'w') as f_out:
          f_out.writelines(lines)
      

      或者如果您不想将所有行都存储在内存中

      with open(logfile) as f_in:
          lines = (l for l in f_in if username in l)
          with open(outfile, 'w') as f_out:
              f_out.writelines(lines)
      

      我更喜欢第一个,但对于一个大文件,它可能会拖拽。

      【讨论】:

      • 第二种情况下不需要缩进第二个'with',原因与第一种情况下不需要缩进相同。
      • @Karl Knechtel 我确实这样做了。因为在第二种情况下,我使用了生成器表达式,文件将被关闭,并且如果with 语句退出,则在生成器表达式实际被处理时会导致错误。尝试一下。这是我能想到的将生成器表达式用于文件处理的唯一问题。
      • 啊,我明白了。生成器的存在不会使文件保持打开状态。傻我:)
      【解决方案3】:

      沿着这条线应该就足够了:

      newfile = open(newfilename, 'w')
      for line in file(filename, 'r'):
          if name in line:
              newfile.write(line)
      newfile.close()
      

      见:http://docs.python.org/tutorial/inputoutput.html#methods-of-file-objects

      f.readlines() 返回一个包含文件中所有数据行的列表。

      另一种读取行的方法是遍历文件对象。这样可以节省内存,速度快,并且代码更简单

      >>> for line in f:
              print line
      

      您还可以查看 with 关键字的使用情况。文件在套件完成后正确关闭的优点

      >>> with open(filename, 'r') as f:
      ...     read_data = f.read()
      >>> f.closed
      True
      

      【讨论】:

        【解决方案4】:

        我知道你要求 python,但如果你在 unix 上,这是 grep 的工作。

        grep name file
        

        如果您不在 unix 上,那么...上面的答案可以解决问题:)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-02
          • 2020-01-03
          • 2018-06-28
          • 2023-01-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多