问题描述
a CACAAAAAGCGGCGTGGATTGATATTGTAATACGACTCACTATAGACCAACACTAATAATTATATCACTTCGCCT
b ACAGGNNNNNCTGCGTCTCAGGCGTTTTTTTTTTTTTTTTAAACAGCAAATTTTATTCATATACTAACCCCGCCT
c CAGTTTTTTGTCTCAGGCGTTTTTTTTTTTAAAAATTTTTTTTATCCCGTTTTTATAAGGCTATACCTGTCCGCCT
d CACACAAAAATGAGAGTGGATTGATTATGTAATACGACTCACTATAGGGTCGACAGCTTCGTCTTCGCCGCCTAA
我需要在 my_file.txt
的第二个字段的前 10 个字符中查看 3 个模式。我用我寻找的模式制作了一本字典。
seq={}
seq['bc1']='AAAAAA'
seq['bc2']='TTTTTT'
seq['bc3']='NNNNNN'
微妙之处在于一行通常应该与
如果我们关注前 10 个字符,则只有一个 my_file.txt
模式。例如,模式 AAAAA
将与第一行和第四行匹配。
我想将字典作为输出,其中包含字典 seq
的键和 my_file.txt
的相应行作为值。最后一个条件是模式“GCCT”需要出现在行的最后 10 个字符中;如果没有,即使找到了 seq
中的模式,该行也不会添加到字典中(这里,模式总是出现在最后 10 个字符中):
defaultdict(<type 'list'>,{'bc1': [['a','CACAAAAAAGCGGCGTGGATTGATATGTAATACGACTCACTATAGACCAACACTAATAATTATATCACTTCGCCT\n'],['d','CACACAAAAAATGAGAGTGGATTGATATGTAATACGACTCACTATAGGGTCGACAGCTTCGTCTTCGCCGCCTAA\n']],'bc2': ['c','CAGTTTTTTGTCTCAGGCGTTTTTTTTTTTTTTTTTTTCACAAATAATCCCGTTTTTATAAAAACCTGTCCGCCT\n'],'bc3':['ACAGGNNNNNCTGCGTCTCAGGCGTTTTTTTTTTTTTTTTAAACAGCAAATTTTATTCATATACTAACCCCGCCT\n']})
我有:
from collections import defaultdict
my_dict = defaultdict(list)
pattern='GCCT'
with open("my_file.txt","r") as file:
for lines in my_file.readlines():
line=lines.split("\t")
bar=line[1][0:10]
tail=line[1][-10:]
for k,v in seq.items():
if v in bar and pattern in tail:
my_dict[k].append(line)
然后,我将该字典提取为一个 csv 文件,并将密钥作为文件名:
for k,v in my_dict.items():
with open("output_{}.fna".format(k),"w") as f:
csv=';'.join([','.join(t) for t in v])
f.write("%s,%s\n" % (k,csv))
我遇到的问题是:当我查看输出文件时,我可以将同一行分成两个文件。例如,行 c XXXXXX
将被添加到两个文件中:一个对应于 bc1(不正常)和 bc2(正常 -> 在模式 TTTTT
上选择)。原因是:我们可以在行 AAAAA
CAGTTTTTTGTCTCAGGCGTTTTTTTTTTTAAAAATTTTTTTTATCCCGTTTTTATAAGGCTATACCTGTCCGCCT -> 的中间发现模式 c
-> 所以,选择不仅在前 15 个字符上完成.我不明白为什么。
有什么帮助吗?
解决方法
如果我理解正确,您的目标是在字符串的前 15 个字符 (CACATA
) 中找到具有特定字符串(如 CACATAGAGCGCTGC
)的行,(我猜是 dna)({ {1}})
在这种情况下,您的代码中的 CACATAGAGCGCTGCGTGGATTGATATGTAATACGACTCACTATAGACCAACACTAATAATTATATCACTTCTTAAAATGGCTAATTCATTTTTCTTATCCTTATTAGTGTTATTC
太长了。
seq