使用Python循环读取行

4

所以我有一个包含以下内容的文件:

SequenceName 4.6e-38 810..924
SequenceName_FGS_810..924 VAWNCRQNVFWAPLFQGPYTPARYYYAPEEPKHYQEMKQCFSQTYHGMSFCDGCQIGMCH
SequenceName 1.6e-38 887..992
SequenceName_GYQ_887..992 PLFQGPYTPARYYYAPEEPKHYQEMKQCFSQTYHGMSFCDGCQIGMCH

我希望我的程序只读取包含这些蛋白质序列的行。到目前为止,我已经得到了以下代码,它会跳过第一行并读取第二行:
handle = open(filename, "r")
handle.readline()
linearr = handle.readline().split()
handle.close()

fnamealpha = fname + ".txt"
handle = open(fnamealpha, "w")
handle.write(">%s\n%s\n" % (linearr[0], linearr[1]))
handle.close()

但是它只处理第一个序列,我需要它处理包含序列的每一行,因此我需要一个循环,我该怎么做呢? 保存到文本文件的部分也非常重要,因此我需要找到一种方法来同时实现这两个目标。 使用上述代码的输出如下:
>SequenceName_810..924
VAWNCRQNVFWAPLFQGPYTPARYYYAPEEPKHYQEMKQCFSQTYHGMSFCDGCQIGMCH
2个回答

14

好的,我认为我理解了你的问题——你想要迭代文件中的行,对吗?但是只有序列中的第二行——蛋白质序列——是重要的,对吗?这是我的建议:

# context manager `with` takes care of file closing, error handling
with open(filename, 'r') as handle:
    for line in handle:
        if line.startswith('SequenceName_'):
             print line.split()
             # Write to file, etc.

我的推理是,您只对以SequenceName_###开头的行感兴趣。


3
"readlines"是有害的!它会在内存中分配一系列行。使用像"readline"这样的生成器。在计算生物学等需要处理大量数据时尤其重要。 - Charles Menguy
是的,我看到了你在其他答案上的评论,并查阅了相关资料。它确实看起来像readlines是有问题的,或者至少是多余的。我会编辑我的答案,感谢你的提示! - Brian Gesiak
1
没问题,同样的道理,请使用“xrange”而不是“range”,因为“range”会在内存中分配一个完整的数组,而“xrange”只是生成器版本。 - Charles Menguy
我曾认为readlinesrange一样,在Python 3中已被转换为生成器表达式,但对于前者并非如此。顺便说一下,xrange在Python 3中已被弃用。 - Brian Gesiak
好的,SequenceName包括不同蛋白质的名称,所以我不能使用那种方法,因为名称会改变。无论如何,感谢您的答案! :) - John
@John,你应该编辑你的问题并指明规格。顺便说一句,答案应该根据发布的问题而不是事后产生的要求或隐藏的规格进行评估。 - joaquin

1
使用readlines并将其全部放入for循环中。
with open(filename, 'r') as fh:
    for line in fh.readlines:
        # do processing here

在代码的 #do processing here 部分,你可以准备另一个要写入到另一个文件中的行列表。(使用 with 可以处理所有适当的关闭和确保。)

1
这条建议如何帮助他跳过每一行?另外,代码是错误的。那不是你调用readlines的方式,也没有必要调用readlines - agf
1
根据我的理解,他想要跳过包含特定序列的行。为此,他可以将逻辑放在 for 循环中。此外,确实是这样调用 readlines。它需要附加到一个文件句柄上。参见:http://docs.python.org/library/stdtypes.html?highlight=readline#file.readlines - Logan Bibby
2
调用“readlines”将创建文件中所有行的数组。如果文件很大,这可能会成为一个问题,最好使用生成器。 - Charles Menguy
1
你根本没有调用readlines,应该是fh.readlines()。而且这并不是必需的,因为像前面的回答中所示,直接迭代文件对象本身就可以获取到文件的每一行。 - agf
它说TypeError:'builtin_function_or_method'对象不可迭代:( - John
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接