Как я могу проверить, является ли файл настоящим FASTQ (python)?

#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 запись fastq

2. Я попробую. Почему другой подход в fasta против fastq в biopython ?

3. @Chris_Rands обновлено, большое спасибо