#python #file #biopython #fasta #fastq
Вопрос:
Я должен проверить, является ли файл FASTA, FASTQ или ни одним из них. Для проверки FASTA я использовал модуль SeqIO
из Bio
:
def is_fasta(filename): with open(filename, "r") as handle: fasta = SeqIO.parse(handle, "fasta") return any(fasta)
Который возвращает значение True, если файл является быстрым, и значение False, если это не так. Но когда я использую версию этой функции FASTQ:
def is_fastq(filename): with open(filename, "r") as handle: fastq = SeqIO.parse(handle, "fastq") return any(fastq)
Я получаю сообщение об ошибке:
Файл «/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/Bio/SeqIO/Interfaces.py», строка 74, в следующем возврате далее(самостоятельные записи) Файл «/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/Bio/SeqIO/QualityIO.py», строка 1085, в итерации для title_line, seq_string, quality_string в FastqGeneralIterator(дескриптор): Файл «/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/Bio/SeqIO/QualityIO.py», строка 932, в FastqGeneralIterator «Записи в файлах Fastq должны начинаться с символа»@»»
Ошибка значения: Записи в файлах Fastq должны начинаться с символа»@».
Может кто-нибудь помочь мне понять, почему это не работает одинаково для FASTA и FASTQ? И как я могу проверить, действительно ли файл является FASTQ
Комментарии:
1.Анализатор BioPython FASTQ специально предназначен для анализа записей FASTQ. Если вы передадите файл, в котором первая запись не начинается с
@
него, это вызовет ошибку. Анализатор FASTA не выдаст ошибку, если вы передадите файл FASTQ. Вместо этого вы должны использоватьtry
except
2. @alex в вашем комментарии выше говорится, что имя файла, представленное как FASTQ, не является файлом FASTQ ?
3. @pippo1980, я не совсем понимаю, о чем вы спрашиваете. Когда
SeqIO.parse
вызывается дескриптор файла и передается имя формата файла. Когда формат «fasta», используется анализатор FASTA, он будет перебирать весь файл FASTQ без возникновения ошибки или возврата каких-либо записей. Если формат «fastq», используется анализатор FASTQ, он выдаст ошибку, если файл FASTQ не предоставлен. Расширение файла (.{fa,fasta,fq,fastq}
) не рассматривается и не используется; только имя формата файла.4. У меня такое чувство, что вы спрашиваете о чем-то, что вы уже решили. Вы хотите знать, является ли файл допустимым файлом FastQ, верно? Если вы передадите файл синтаксическому анализатору FastQ, и он завершится неудачно, то это недопустимый файл FastQ. Если это работает, то это действительный файл FastQ. У вас уже есть эта информация в вашем коде. В вашем примере вы получаете ошибку ValueError, которая четко указывает вам, что файл FastQ должен начинаться с @, и это не относится к вашему файлу.
Ответ №1:
согласно предложению @Alex здесь моя попытка:
from Bio import SeqIO # filename = 'fastq.fastq' filename = 'fasta.fasta' def is_fasta(filename): with open(filename, "r") as handle: fasta = SeqIO.parse(handle, "fasta") return any(fasta) def is_fastq(filename): with open(filename, "r") as handle: fastq = SeqIO.parse(handle, "fastq") try : return any(fastq) except Exception as e: print(e) return False print(' is it fasta ? : ',is_fasta(filename)) print(' is it fastq ? : ',is_fastq(filename))
требуется два файла для альтернативного использования:
`'fastq.fastq'` or `'fasta.fasta'`
раскомментируйте только один из них.
результат с правильным файлом fastq:
is it fasta ? : False is it fastq ? : True
результат с правильным файлом fasta:
is it fasta ? : True Records in Fastq files should start with '@' character is it fastq ? : False
Мне кажется, что анализатор fasta не выдаст никакой ошибки, если чтение файла неправильное, а просто предоставит пустой итератор, в то время как анализатор fastq предупредит вас о неправильном файле, пожалуйста, @alex поправьте меня, если я ошибаюсь (я тоже учусь)
Комментарии:
1. так и должно быть
try : return any(fastq)
—any()
дважды позвонив, вы приводите к ошибке, когда есть только 1 запись fastq2. Я попробую. Почему другой подход в fasta против fastq в biopython ?
3. @Chris_Rands обновлено, большое спасибо