【发布时间】:2017-09-11 06:47:53
【问题描述】:
我正在尝试比较两个文件并提取具有其他文件子集的序列。而且,我也想提取标识符。但是,我能做的是能够提取包括子集的序列。示例文件是:
text.fa
>header1
ETTTHAASCISATTVQEQ*TLFRLLP
>header2
SKSPCSDSDY**AAA
>header3
SSGAVAAAPTTA
和,
textref.fa
>textref.fa
CISA
AAAP
AATP
当我运行代码时,我有这个输出:
ETTTHAASCISATTVQEQ*TLFRLLP
SSGAVAAAPTTA
但是,我的预期输出是标题:
>header1
ETTTHAASCISATTVQEQ*TLFRLLP
>header3
SSGAVAAAPTTA
我的代码分为两部分,首先我使用这些序列创建文件,然后尝试从原始 fasta 文件中提取它们的标题:
def get_nucl(filename):
with open(filename,'r') as fd:
nucl = []
for line in fd:
if line[0]!='>':
nucl.append(line.strip())
return nucl
def finding(filename,reffile):
nucl = get_nucl(filename)
with open(reffile,'r') as reffile2:
for line in reffile2:
for element in nucl:
if line.strip() in element:
yield(element)
with open('sequencesmatched.txt','w') as output:
results = finding('text.fa','textref.fa',)
for res in results:
print(res)
output.write(res + '\n')
所以,在这个sequencesmatched.txt 中,我有text.fa 的序列,其中有textref.fa 的子字符串。如:
ETTTHAASCISATTVQEQ*TLFRLLP
SSGAVAAAPTTA
所以在另一部分,检索相应的标头和这些序列:
def finding(filename,seqfile):
with open(filename,'r') as fastafile:
with open(seqfile,'r') as sequf:
alls=[]
for line in fastafile:
alls.append(line.strip())
print(alls)
sequfs = []
for line2 in sequf:
sequfs.append(line2.strip())
if str(line.strip()) == str(line2.strip()):
num = alls.index(line.strip())
print(alls[num-1] + line)
print(finding('text.fa','sequencesmatched.txt'))
但是,作为输出,我只能检索一个序列,即第一个匹配项:
>header1
ETTTHAASCISATTVQEQ*TLFRLLP
也许我可以在没有第二个文件的情况下做到这一点,但我无法制作正确的循环来获取序列及其各自的标题。因此,我走了很长的路..
如果您能提供帮助,我会很高兴!
【问题讨论】:
-
这是一个错误:all[num-1],这不是你的列表,而是 python 中的一个函数。你只是错过了拼写吗? “s”不见了
-
@Bestasttung 谢谢!我没注意到。现在,我没有错误,但得到了不需要的输出。我正在编辑问题。