code: def parse_fasta(infile, upper=False):
      '''
      parse a fasta-formatted file and returns header
      can be a fasta file that contains multiple records.
      '''
      try:
          fp = must_open(infile)
      except:
          fp = infile
      # keep header
      fa_iter = (x[1] for x in groupby(fp, lambda row: row[0] == '>'))
      for header in fa_iter:
          header = next(header)
          if header[0] != '>':
              continue
          # drop '>'
          header = header.strip()[1:]
          # stitch the sequence lines together and make into upper case
          seq = "".join(s.strip() for s in next(fa_iter))
          if upper:
              seq = seq.upper()
          yield header, sef parse_fasta(infile, upper=False):
      '''
      parse a fasta-formatted file and returns header
      can be a fasta file that contains multiple records.
      '''
      try:
          fp = must_open(infile)
      except:
          fp = infile
      # keep header
      fa_iter = (x[1] for x in groupby(fp, lambda row: row[0] == '>'))
      for header in fa_iter:
          header = next(header)
          if header[0] != '>':
              continue
          # drop '>'
          header = header.strip()[1:]
          # stitch the sequence lines together and make into upper case
          seq = "".join(s.strip() for s in next(fa_iter))
          if upper:
              seq = seq.upper()
          yield header, seq
docs: parse a fasta-formatted file and returns header
      can be a fasta file that contains multiple records.