Оболочка Python зависает при чтении (fasta) файла - PullRequest
1 голос
/ 06 марта 2012

Начну с того, что покажу код, который у меня есть:

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

1 Ответ

1 голос
/ 06 марта 2012

Вы никогда не определяли 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() операторов в проблемных точках.

Также рассмотрите возможность включения дополнительной информации о содержимом файла, который вы пытаетесь проанализировать.Это может помочь нам помочь.

...