蟒蛇;打印文件名和标题

时间:2017-09-22 10:43:35

标签: python

我有文件(带序列的fasta文件),如下所示:

File1.fasta

>1
GTCTTCCGGCGAGCGGGCTTTTCACCCGCTTTATCGTTACTTATGTCAGCATTCGCACTT
CTGATACCTCCAGCAACCCTCACAGGCCACCTTCGCAGGCTTACAGAACGCTCCCCTACC
CAACAACGCATAAACGTCGCTGCCGCAGCTTCGGTGCATGGTTTAGCCCCGTTACATCTT
CCGCGCAGGCCGACTCGACCAGTGAGCTATTACGCTTTCTTTAAATGATGGCTGCTTCTA
AGCCAACATCCTGGCTGTCTGG
>2
AAAGAAAGCGTAATAGCTCACTGGTCGAGTCGGCCTGCGCGGAAGATGTAACGGGGCTAA
ACCATGCACCGAAGCTGCGGCAGCGACACTCAGGTGTTGTTGGGTAGGGGAGCGTTCTGT
AAGCCTGTGAAGGTGGCCTGTGAGGGTTGCTGGAGGTATCAGAAGTGCGAATGCTGACAT
AAGTAACGATAAAGCGGGTGAAAAGCCCGCTCGCCGGAAGACCAAGGGTTCCTGTCCAAC
GTTAATCGGGGCAGG

File2.fasta

>1
CAACAACGCATAAACGTCGCTGCCGCAGCTTCGGTGCATGGTTTAGCCCCGTTACATCTT
>2
CCGCGCAGGCCGACTCGACCAGTGAGCTATTACGCTTTCTTTAAATGATGGCTGCTTCTA

使用我的脚本,我会计算这些文件中的所有5-mers。我的代码如下:

import operator
import glob

def printSeq(name, seq):
    kmers = {}
    k = 5
    for i in range(len(seq) - k + 1):
       kmer = seq[i:i+k]
       if kmer in kmers:
          kmers[kmer] += 1
       else:
          kmers[kmer] = 1

    for kmer, count in kmers.items():
       print (kmer + "\t" + str(count))

    sortedKmer = sorted(kmers.items(), reverse=True)

    for item in sortedKmer:
       print (item[0] + "\t" + str(item[1]))


for name in glob.glob('*.fasta'):
    with open(name, 'r') as f:
        seq = ""
        key = ""
        for line in f.readlines():
            if line.startswith(">"):
                if key and seq:
                    printSeq(key, seq)
                key = line[1:].strip()
                seq = ""
            else:
                seq += line.strip()
        printSeq(key, seq)

输出现在是5-mer,然后是计数。

我想调整输出,以便对于每个输出行,我得到文件名后跟标题和计数,如下所示:

File1 1 GTCTT 1
File1 1 TCTTC 1
File1 1 CTTCC 1
....
File2 2 TTCTA 1

我怎样才能做到这一点?

其他问题 我想添加数据的反向补码序列,并将其与先前的数据一起计数。我得到反向补码的代码如下

from Bio import SeqIO
for fasta_file in glob.glob('*.fasta'):
    for record in SeqIO.parse(fasta_file, "fasta"):
        reverse_complement = ">" + record.id + "\n" + record.seq.reverse_complement()

因此,文件1的“reverse_complement”,标题> 1必须与前一个一起计算等。如何将这些数据包含在我以前的文件中并一起计算?

我的reverse_complement数据是

File1.fasta(reverse_complement)

>1
CCAGACAGCCAGGATGTTGGCTTAGAAGCAGCCATCATTTAAAGAAAGCGTAATAGCTCACTGGTCGAGTCGGCCTGCGCGGAAGATGTAACGGGGCTAAACCATGCACCGAAGCTGCGGCAGCGACGTTTATGCGTTGTTGGGTAGGGGAGCGTTCTGTAAGCCTGCGAAGGTGGCCTGTGAGGGTTGCTGGAGGTATCAGAAGTGCGAATGCTGACATAAGTAACGATAAAGCGGGTGAAAAGCCCGCTCGCCGGAAGAC
>2
CCTGCCCCGATTAACGTTGGACAGGAACCCTTGGTCTTCCGGCGAGCGGGCTTTTCACCCGCTTTATCGTTACTTATGTCAGCATTCGCACTTCTGATACCTCCAGCAACCCTCACAGGCCACCTTCACAGGCTTACAGAACGCTCCCCTACCCAACAACACCTGAGTGTCGCTGCCGCAGCTTCGGTGCATGGTTTAGCCCCGTTACATCTTCCGCGCAGGCCGACTCGACCAGTGAGCTATTACGCTTTCTTT

2 个答案:

答案 0 :(得分:1)

这也可以使用Counter()完成,如下所示:

from collections import Counter
from itertools import groupby
import glob

for fasta_file in glob.glob('*.fasta'):
    basename = os.path.splitext(os.path.basename(fasta_file))[0]

    with open(fasta_file) as f_fasta:
        for k, g in groupby(f_fasta, lambda x: x.startswith('>')):
            if k:
                sequence = next(g).strip('>\n')
            else:
                d = list(''.join(line.strip() for line in g))
                counts = Counter()

                while len(d) >= 5:
                    five_mer = '{}{}{}{}{}'.format(d[0], d[1], d[2], d[3], d[4])
                    counts[five_mer] += 1
                    del d[0]

                for five_mer, count in sorted(counts.items(), key=lambda x: (-x[1], x[0])):
                    print "{} {} {} {}".format(basename, sequence, five_mer, count)

这将首先为您提供最大计数的输出,然后按字母顺序输出:

File1 1 CAGGC 3
File1 1 CGCAG 3
File1 1 GCTTT 3
File1 1 AACGC 2
File1 1 ACATC 2
File1 1 ACGCT 2
File1 1 AGGCC 2

它使用Python的groupby()函数一起读取行组。它要么读取单个序列行,要么读取5个mer行的列表。 kstartswith()电话的结果。因此,当kFalse时,取出返回的所有行,从每个行中删除换行符,然后将它们连接在一起以生成一行字符。

然后从列表中读取前5个字符,将它们连接在一起并将它们作为键添加到Counter()。然后它从列表中删除第一个字符并重复,直到剩余少于5个字符。

仅按字母顺序排列:

for five_mer, count in sorted(counts.items()):

Counter()的工作方式与字典相同,因此.items()会提供键值对列表。这些在显示之前进行排序。

答案 1 :(得分:0)

您更改了

的签名
def printSeq(name, seq)

def printSeq(file, header, name, seq):

将新变量合并到print语句中 e.g。

print (item[0] + "\t" + str(item[1]))
v
print (file + "\t" + header + "\t" + item[0] + "\t" + str(item[1]))

然后,在循环中将信息传递给此函数。

循环中有可用的文件名,存储在变量name

解析检测到的行中的标题,并将其存储在变量中供以后使用。后来的用法是当你调用printSeq - 函数