【发布时间】:2021-12-04 18:40:06
【问题描述】:
我必须检查一个文件是 FASTA、FASTQ 还是这些都不是。对于 FASTA 检查,我使用了来自 Bio 的模块 SeqIO:
def is_fasta(filename):
with open(filename, "r") as handle:
fasta = SeqIO.parse(handle, "fasta")
return any(fasta)
如果文件是 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 行,下一步 返回下一个(self.records) 文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/Bio/SeqIO/QualityIO.py”,第 1085 行,在迭代中 对于 FastqGeneralIterator(handle) 中的 title_line、seq_string、quality_string: FastqGeneralIterator 中的文件“/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/Bio/SeqIO/QualityIO.py”,第 932 行 "Fastq 文件中的记录应以 '@' 字符开头"
ValueError:Fastq 文件中的记录应以“@”字符开头
有人能帮我理解为什么 FASTA 和 FASTQ 的工作方式不同吗?以及如何检查文件是否是真正的 FASTQ
【问题讨论】:
-
BioPython FASTQ 解析器专门用于解析 FASTQ 记录。如果您传递的文件的第一条记录不是以
@开头的,则会引发错误。如果您传递 FASTQ 文件,FASTA 解析器不会引发错误。相反,您应该使用tryexcept -
@alex 您是否在上面的评论中指出作为 FASTQ 提交的文件名不是 FASTQ 文件?
-
@pippo1980,我不完全明白你在问什么。当
SeqIO.parse被称为文件句柄并传递文件格式名称时。当格式为“fasta”时,使用 FASTA 解析器,它将遍历整个 FASTQ 文件,而不会引发错误或返回任何记录。当格式为“fastq”时,使用 FASTQ 解析器,如果未提供 FASTQ 文件,它将引发错误。不考虑或使用文件扩展名 (.{fa,fasta,fq,fastq});只有文件格式名称。 -
我感觉你在问一些你已经解决的问题。你想知道一个文件是否是一个有效的 FastQ 文件,对吧?如果将文件提供给 FastQ 解析器但它失败了,那么它不是一个有效的 FastQ 文件。如果它有效,那么它是一个有效的 FastQ 文件。您的代码中已经包含该信息。在你的例子中,你得到一个 ValueError,它清楚地告诉你一个 FastQ 文件应该以 @ 开头,而你的文件不是这样。
标签: python file biopython fasta fastq