附加一个 defaultdict

问题描述

我有那个文件 my_file.txt(我只显示开头):

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...