Открытие файловых дескрипторов для использования с TabularMSA в skbio

Привет, команда Skbio.

Так что мне нужно разрешить или MSA ДНК или РНК. Когда я делаю следующее, если я пропускаю alignment_fh.close(), skbio читает строку 'non header' в блоке exc, заставляя меня думать, что мне нужно сначала закрыть файл, чтобы он начался в начале, но если я добавлю alignment_fh.close() Я не могу заставить его читать файл. Я пытался открыть его различными способами, но я считаю, что TabularMSA.read() должен разрешать файлы ИЛИ файловые дескрипторы. Мысли? Спасибо!

try:
    aln = skbio.TabularMSA.read(alignment_fh, constructor=skbio.RNA)
except:
    alignment_fh.close()
    aln = skbio.TabularMSA.read(alignment_fh, constructor=skbio.DNA)

1 ответ

Решение

Я пытался открыть его различными способами, но я считаю, что TabularMSA.read() должен разрешать файлы ИЛИ файловые дескрипторы.

Вы правы: scikit-bio обычно поддерживает чтение и запись файлов с использованием открытых файловых дескрипторов или путей к файлам.

Проблема, с которой вы сталкиваетесь, заключается в том, что ваш первый TabularMSA.read() вызов читает все содержимое дескриптора открытого файла, так что когда второй TabularMSA.read() звонок ударил в пределах except Блок, указатель файла уже находится в конце дескриптора открытого файла - вот почему вы получаете сообщение об ошибке, указывающее, что файл пуст.

Такое поведение является преднамеренным; когда scikit-bio задается дескриптор открытого файла, он будет считывать или записывать в файл, но не будет пытаться управлять указателем файла дескриптора (этот тип управления зависит от вызывающего кода).

Теперь, когда запрашивает scikit-bio прочитать путь к файлу (то есть строку, содержащую путь к файлу на диске или доступный по некоторому URI), scikit-bio будет обрабатывать открытие и закрытие дескриптора файла, так что зачастую это проще путь

Вы можете использовать пути к файлам или файловые дескрипторы для достижения своей цели. В следующих примерах предположим, aln_filepath это str указывая на файл выравнивания на диске (например, "/path/to/my/alignment.fasta").

  • С путями к файлам: Вы можете просто передать путь к файлу обоим TabularMSA.read() звонки; нет open() или же close() звонки необходимы с вашей стороны.

    try:
        aln = skbio.TabularMSA.read(aln_filepath, constructor=skbio.RNA)
    except ValueError:
        aln = skbio.TabularMSA.read(aln_filepath, constructor=skbio.DNA)
    
  • С файловыми дескрипторами: вам нужно будет открыть файловый дескриптор и сбросить указатель файла в вашем except блок перед прочтением во второй раз.

    with open(aln_filepath, 'r') as aln_filehandle:
        try:
            aln = skbio.TabularMSA.read(aln_filehandle, constructor=skbio.RNA)
        except ValueError:
            aln_filehandle.seek(0)  # reset file pointer to beginning of file
            aln = skbio.TabularMSA.read(aln_filehandle, constructor=skbio.DNA)
    

Примечание: в обоих примерах я использовал except ValueError вместо "всеобъемлющего" except заявление. Я рекомендую ловить определенные типы ошибок (например, ValueError) вместо какого-либо исключения, потому что код может давать сбой по-разному, чем вы ожидаете. Например, с "универсальным" except заявление, пользователи не смогут прервать вашу программу с Ctrl-C так как KeyboardInterrupt будет пойман и проигнорирован.

Другие вопросы по тегам