Оболочка Python зависает при чтении (fasta) файла

1

Я собираюсь начать, показывая код, который у меня есть до сих пор:

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
  • 0
    e никогда не определяется в rF .
  • 0
    благодарю вас!! Я не могу поверить, что я пропустил это! С другой стороны, это одна из тех мелочей, которую легко не заметить. Но да, вы спасли день!
Показать ещё 3 комментария
Теги:
fasta
freeze

1 ответ

1
Лучший ответ

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

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

  • 0
    Ой! Прошу прощения, но проблема все еще не решена, даже после удаления обработки ошибок (которая в любом случае была более причудливым дополнением) оболочка все еще зависает.
  • 0
    Смотрите мои изменения для нового кода
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню