2016-06-15 2 views
1

Мне нужно прочитать из файла, пока не будет достигнут определенный символ без сохранения целой строки.Обработка файлов на Python Один символ за один раз

Я попытался это:

def read_one_fasta_entry(fStream) : 
    s = '' # temp var 
    while (s != '>') : # '>' is the char to read until and then discard/skip 
     fStream.read(1) 

Однако, это просто посылает программу в бесконечный цикл с заданным входом: > инжир | 100226.1.peg.1 SCEND.02c, неизвестные, сомнительные CDS, Len: 225aa [Streptomyces coelicolor A3 (2)] MTGHHESTGPGTALSSDSTCRVTQYQTAGVNARLRLFALLERRACPRARRTTWWPGRSAR WWSWTAWRRLLGVCCVRGRLGRRRDGGERGPGGHRGPGLATARRRSGGATELAVHCADVR QRERADLVRLEGFVRESVLPRAHPHTTARRRVLEVLGEAGSLCTARTVNSDEDYILCTLG VGHYDPDDQPPFKDGKPGWQRAGASIWNGSGAACIPHAAIEGPRK

Есть много других записей, чем указано выше, и мне нужно сохранить идентификатор (fig | 10026.1.peg.1) и последовательность (MTGHHE ...) и собирался использовать вышеупомянутый метод для обработки одного символа на время, когда файл детерминирован ('>' перед идентификатором, '' для завершения идентификатора, ']' перед последовательностью), но он не работает. Любой совет?

** EDIT я теперь обновил программу, и она, кажется, работает по большей части, но это выглядит, как я получаю компенсировано «>» Мой модуль:

def read_one_fasta_entry(fStream) : 
    while (True) : 
     s = '' 
     while (s != '>') : # Discard first char/extra chars further in the file 
      s = fStream.read(1) 

     pegid = '' 
     while (s != ' ') : # read one char at a time and append to pegid until whitespace 
      s = fStream.read(1) 
      pegid += s 

     protseq = '' 
     while (s != ']') : # read one char at a time and append to protseq until close square bracket 
      s = fStream.read(1) 

     while(s != '>') : 
      s = fStream.read(1) 
      protseq += s 

     yield (pegid, protseq) 

Driver:

#!/usr/bin/env python3 

import sys 

import p3mod 


f = open(sys.argv[1]) 
for (pegid,protseq) in p3mod.read_one_fasta_entry(f): 
    print(pegid,protseq) 
f.close() 

Любые идеи о том, как пропустить первый «>»? Я новичок в python, но есть ли эквивалент цикла do ... while()? Похоже, это было бы очень эффективно здесь.

+1

вы никогда не устанавливая вашу переменную 's' равным к введенному так' ы = «» 'все время. –

+0

Это не может быть ваш фактический код; параметром метода является 'fstream' (нижний регистр s), а позже вы используете' fStream' (верхний регистр S). Скопируйте/вставьте код _exactly_. – marcelm

+0

@RNar l0l ничего себе, это неловко ... Спасибо, что указали это. – edge6768

ответ

0

ОБНОВЛЕНИЕ: Я понял! Мне пришлось компенсировать первый провал символа '>' (строка 2) и проверить, достиг ли я эф (строка 19). Вот мой обновленный модуль (драйвер в исходное сообщение):

def read_one_fasta_entry(fStream) : # Return iterable two-tuples of (pegid, protseq) as long as eof is not reached 
    s = fStream.read(1) # Offset skipping '>' char 
    while (True) : # Loop to eof 
     s = '' 
     pegid = '' 

     while (s != ' ') : # Read one char at a time and append to pegid until whitespace 
      s = fStream.read(1) 
      pegid += s 

     protseq = '' 
     while (s != ']') : # Read one char at a time and append to protseq until close square bracket 
      s = fStream.read(1) 

     while(s != '>' and s != '') : # Read until next entry (s != '>') or eof (s != '') 
      s = fStream.read(1) 
      if(s != '>') : 
       protseq += s 

     if(s == '') : # Check for eof 
      yield (pegid, protseq) 
      raise StopIteration() # Close generator 

     yield (pegid, protseq) 
Смежные вопросы