gpt4 book ai didi

python - 通过已知序列从fasta文件中提取序列和 header

转载 作者:太空宇宙 更新时间:2023-11-04 04:59:26 25 4
gpt4 key购买 nike

我正在尝试比较两个文件并提取具有其他文件子集的序列。而且,我也想提取标识符。但是,我能做的是能够提取包括子集的序列。示例文件是:

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 文件中提取它们及其 header :

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

因此在另一部分中,检索相应的 header 和这些序列:

    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

也许我可以在没有第二个文件的情况下做到这一点,但我无法进行正确的循环来获取序列及其各自的标题。因此,我走了很远的路..

如果你能帮上忙,我会很高兴!

最佳答案

如果你的文件总是相同的结构,你可以做一些更容易的事情:

def get_nucl(filename):
with open(filename, 'r') as fd:
headers = {}
key = ''
for line in fd.readlines():
if '>' in line:
key = line.strip()[1:] # to remove the '>'
else:
headers[key] = line.strip()

return headers

这里我假设您的文件以“>headern”开头,否则您必须添加一些测试。现在你有了像 headers['header1'] = 'ETTTHAASCISATTVQEQ*TLFRLLP' 这样的字典。

所以现在要找到匹配项,您只需使用该字典:

def finding(filename, reffile):
headers = get_nucl(filename)
with open(reffile, 'r') as f:
matches = {}
for line in f.readlines():
for key, value in headers.items():
if line.stip() in value and key not in matches:
matches[key] = value

return matches

因此,当您有一个 header 与它们的值匹配的字典时,如果您有一个子字符串,并且您已经将 header 值作为键,则只需 checkin 字典即可。

刚刚看到你做了 print(finding(....) ,你的函数已经打印了,所以就调用它吧。

关于python - 通过已知序列从fasta文件中提取序列和 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46149689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com