我在test.fa中有以下几行:
#test.fa
>1
AGAGGGAGCTG
CCTCAGGGCTG
CACTCAGGAAA
TTGGGGCGCTG
AGCATGGGGGG
CAGGAGGGGCC
我需要忽略以“>”开头的行,并将以下行连接成一个单独的字符串。但是,以下脚本不仅会跳过包含“>”的行,也是连续剩余之前的下一行。
#!/usr/bin/env python
import sys
import re
string = ""
with open("test.fa","rt") as f:
for line in f:
if re.match(">",line):
line = f.next()
else:
line = line.rstrip("\n")
string = string + line
print (string)
任何人都可以帮忙修复脚本,或建议更好的方法吗?谢谢!!
答案 0 :(得分:5)
无论如何,行计数器已经递增了每个循环,因此您实际上不需要在if
块中执行任何操作。
for line in f:
if re.match(">",line):
pass
else:
line = line.rstrip("\n")
string = string + line
或者
for line in f:
if not re.match(">",line):
line = line.rstrip("\n")
string = string + line
其他增强功能:您不需要正则表达式来确定字符串的起始字符,并且通常建议在连接字符串时累积行中的行。
lines = []
for line in f:
if not line.startswith(">"):
lines.append(line.rstrip("\n"))
string = "".join(lines)
或者,作为一个班轮:
string = "".join(line.rstrip("\n") for line in f if not line.startswith(">"))
答案 1 :(得分:1)
你实际上是在调用line.next()
两次,因为每次你循环,它都会得到下一行..我建议你去看看这个
#!/usr/bin/env python
import sys
import re
string = ""
with open("test.fa","rt") as f:
for line in f:
if not re.match(">",line)::
line = line.rstrip("\n")
string = string + line
print (string)
答案 2 :(得分:0)
您不需要
line = f.next()
在迭代器中自动发生。就这样做:
#!/usr/bin/env python
import sys
import re
string = ""
with open("test.fa","rt") as f:
for line in f:
if not re.match(">",line):
line = line.rstrip("\n")
string = string + line
print (string)