Я собираюсь начать, показывая код, который у меня есть до сих пор:
def err(em):
print(em)
exit
def rF(f):
s = ""
try:
fh = open(f, 'r')
except IOError:
e = "Could not open the file: " + f
err(e)
try:
with fh as ff:
next(ff)
for l in ff:
if ">" in l:
next(ff)
else:
s += l.replace('\n','').replace('\t','').replace('\r','')
except:
e = "Unknown Exception"
err(e)
fh.close()
return s
По какой-то причине оболочка python (я использую 3.2.2) зависает всякий раз, когда пытаюсь прочитать файл, набрав:
rF("mycobacterium_bovis.fasta")
Условные в функции rF должны предотвращать чтение каждой строки, начинающейся с токена ">". Эти строки не являются кодом ДНК/РНК (это то, что я пытаюсь прочитать из этих файлов), и его следует игнорировать.
Я надеюсь, что кто-нибудь сможет мне помочь, я не вижу своей ошибки.
Как обычно, МНОГО!
EDIT: * Проблема сохраняется! * Это код, который я сейчас использую, я удалил обработку ошибок, которая в любом случае была причудливым дополнением, но оболочка зависает всякий раз, когда вы пытаетесь прочитать файл. Это мой код сейчас:
def rF(f):
s = ""
try:
fh = open(f, 'r')
except IOError:
print("Err")
try:
with fh as ff:
next(ff)
for l in ff:
if ">" in l:
next(ff)
else:
s += l.replace('\n','').replace('\t','').replace('\r','')
except:
print("Err")
fh.close()
return s
Вы никогда не определяли e
.
Таким образом, вы получите NameError, который скрывается голым, except:
Вот почему хорошо и полезно указывать исключение, например:
try:
print(e)
except NameError as e:
print(e)
Однако в таких случаях, как ваша, когда вы не обязательно знаете, каково будет исключение, вы должны хотя бы использовать этот метод отображения информации об ошибке:
import sys
try:
print(e)
except: # catch *all* exceptions
e = sys.exc_info()[1]
print(e)
Который, используя исходный код, который вы опубликовали, напечатал бы следующее:
name 'e' is not defined
Изменить на основе обновленной информации:
Конкатенация такой строки будет довольно медленной, если у вас большой файл.
Рассмотрите возможность записи отфильтрованной информации в другой файл, например:
def rF(f):
with open(f,'r') as fin, open('outfile','w') as fou:
next(fin)
for l in fin:
if ">" in l:
next(fin)
else:
fou.write(l.replace('\n','').replace('\t','').replace('\r',''))
Я тестировал, что приведенный выше код работает в файле FASTA на основе указанной здесь спецификации формата: http://en.wikipedia.org/wiki/FASTA_format с использованием Python 3.2.2 [GCC 4.6.1] на linux2.
Несколько рекомендаций:
print()
в проблемных точках.Кроме того, рассмотрите возможность включения дополнительной информации о содержимом файла, который вы пытаетесь проанализировать. Это может облегчить нам помощь.
e
никогда не определяется вrF
.