【问题标题】:Searching a text file and grabbing all lines that do not include ## in python搜索文本文件并在 python 中抓取所有不包含 ## 的行
【发布时间】:2014-05-24 10:01:18
【问题描述】:

我正在尝试编写一个 python 脚本来从一些建模结果中读取一个大文本文件,获取有用的数据并将其保存为一个新数组。文本文件以 ## 开头的方式输出,每一行都是无用的。我需要一种方法来搜索并抓取所有不包含## 的行。我习惯在这种情况下使用 grep -v 并通过管道传输到文件。我想用python来做!

非常感谢。

-泰勒

【问题讨论】:

  • 好吧,你说你正在尝试写它。向我们展示您尝试过的方法,以及无效的方法。
  • 当然,我会补充一点。我现在不在我的电脑前。

标签: python arrays file search find


【解决方案1】:

我会使用这样的东西:

fh = open(r"C:\Path\To\File.txt", "r")

raw_text = fh.readlines()
clean_text = []

for line in raw_text:
    if not line.startswith("##"):
        clean_text.append(line)

或者您也可以同时清除换行符和回车符,并稍作修改:

for line in raw_text:
    if not line.startswith("##"):
        clean_text.append(line.rstrip("\r\n"))

您将得到一个列表对象,其中每个元素包含一行所需的文本。您可以使用 string.split() 将其拆分为单个单词,这将为您提供每个原始列表元素的嵌套列表,您可以轻松索引(假设您的文本当然有空格)。

clean_text[4][7]

将返回第 5 行第 8 个单词。

希望这会有所帮助。

[编辑:更正循环中的缩进]

【讨论】:

  • 非常感谢!我不知道 if not line.startswith("##")
【解决方案2】:

我的建议是执行以下操作:

listoflines = [ ] 

with open(.txt, "r") as f:     # .txt = file, "r" = read
    for line in f:
        if line[:2] != "##": #Read until the second character 
            listoflines.append(line)


print listoflines

如果你有勇气,你也可以执行以下操作,致谢 ALEX THORNTON:

listoflines = [l for l in f if not l.startswith('##')]

另一个答案也很好,尤其是教 .startswith 函数,但我认为这是更 Pythonic 的方式,并且还具有在完成文件后自动关闭文件的优点。

【讨论】:

  • 非常感谢,我也在使用 with open() as f:
  • 好人,这是一个很好的习惯,省去了每次都输入 f.close() 的麻烦,或者忘记的风险
  • 我同意,如您所见,我忘记了我给出的示例。
  • @Philip Lawrence,别担心,这发生在我们最好的人身上^_^
  • 顺便说一句,你不需要'r',默认是那个模式,而不是for循环,你可以这样做:array = [l for l in f if not l.startswith('##')]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 2018-12-20
  • 1970-01-01
  • 2020-01-16
  • 2012-05-21
  • 1970-01-01
  • 2011-06-14
相关资源
最近更新 更多