附加defaultdict

2024-09-28 18:54:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我有那个文件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上选择)。原因是:我们可以发现线的中间{{CD4}},{{CD11}} CGTTTTTGTCTCGTGTTTTTTTT <强> AAAAA < /强> TTTTTTT ATCCGTTTTATAGACTACTACTGTCCGCCTT & GT;因此,选择不仅仅是在前15个字符上进行的。我不明白为什么

有什么帮助吗


Tags: 文件intxtfor字典myline模式
1条回答
网友
1楼 · 发布于 2024-09-28 18:54:53

如果我理解正确,您的目标是在字符串的前15个字符(CACATAGAGCGCTGC)中找到具有特定字符串(如CACATA)的行,(我猜是dna)(CACATAGAGCGCTGCGTGGATTGATATGTAATACGACTCACTATAGACCAACACTAATAATTATATCACTTCTTAAAATGGCTAATTCATTTTTCTTATCCTTATTAGTGTTATTC

在这种情况下,代码中的seq太长了

with open("my_file.txt","r") as file:
        for lines in file.readlines():
                line=lines.split("\t")
                # seq=line[1][0:55]
                seq=line[1][0:15]
                for k,v in barcodes.items():
                        if v in seq:
                                my_dict[k].append(lines)

相关问题 更多 >