Открытие файловых дескрипторов для использования с 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
будет пойман и проигнорирован.