Мне нужно прочитать из файла, пока не будет достигнут определенный символ без сохранения целой строки.Обработка файлов на 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()? Похоже, это было бы очень эффективно здесь.
вы никогда не устанавливая вашу переменную 's' равным к введенному так' ы = «» 'все время. –
Это не может быть ваш фактический код; параметром метода является 'fstream' (нижний регистр s), а позже вы используете' fStream' (верхний регистр S). Скопируйте/вставьте код _exactly_. – marcelm
@RNar l0l ничего себе, это неловко ... Спасибо, что указали это. – edge6768