Search code examples
pythonfasta

How to work with nested loop, looping through array elements?


Coming from R background, I wanted to try nested for-loop in python. I am having trouble looping through each iteration of types in my code below. My code works for types[0], but not for successive iterations. How do I solve this?

import sys
import os
myfasta = sys.argv[1]
fasta = open(myfasta)
types = ['CDS', 'tRNA', 'rRNA']

for type in range(len(types)):
    print('My type index is: ' + str(type))
    flag = False
    for line in fasta:
        if line.startswith('>') and types[type] in line:
            flag = True
        elif line.startswith('>'):
          flag = False
        if flag:
            print(line.strip())

myfasta

>1_CDS
AAAAATTTCTGGGCCCCAAAAATTTCTGGGCCCC
AAAAATTTCTGGGCCCCAAAAATTTCTGGGCCCC
AAAAATTTCTGGGCCCCAAAAATTTCTGGGCCCC
GGGGTTTTTTT
>2_CDS
TTAAAAATTTCTGGGCCCCGGGAAAAAA
>3_CDS
TTTGGGAATTAAACCCT
>4_CDS
TTTGGGAATTAAACCCT
>5_rRNA
TTAAAAATTTCTGGGCCCCGGGAAAAAA
>6_tRNA
TTAAAAATTTCTGGGCCCCGGGAAAAAA

Expected result:

My type index is: 0
>1_CDS
AAAAATTTCTGGGCCCCAAAAATTTCTGGGCCCC
AAAAATTTCTGGGCCCCAAAAATTTCTGGGCCCC
AAAAATTTCTGGGCCCCAAAAATTTCTGGGCCCC
GGGGTTTTTTT
>2_CDS
TTAAAAATTTCTGGGCCCCGGGAAAAAA
>3_CDS
TTTGGGAATTAAACCCT
>4_CDS
TTTGGGAATTAAACCCT
My type index is: 1
>5_rRNA
TTAAAAATTTCTGGGCCCCGGGAAAAAA
My type index is: 2
>6_tRNA
TTAAAAATTTCTGGGCCCCGGGAAAAAA

Solution

  • You can't load your file once and iterate over it as often as you want.

    open() returns an iterator, which can only be consumed once.

    Adapt your code to iterate over your file multiple times

    import sys
    import os
    myfasta = sys.argv[1]
    types = ['CDS', 'tRNA', 'rRNA']
    
    for type in range(len(types)):
        print('My type index is: ' + str(type))
        flag = False
        fasta = open(myfasta)
        for line in fasta:
            if line.startswith('>') and types[type] in line:
                flag = True
            elif line.startswith('>'):
              flag = False
            if flag:
                print(line.strip())