【问题标题】:How can I check if a file is a real FASTQ (python)?如何检查文件是否是真正的 FASTQ (python)?
【发布时间】: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 解析器不会引发错误。相反,您应该使用 try except
  • @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


【解决方案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 纠正我(我也在学习)

【讨论】:

  • 它应该是 try : return any(fastq) - 通过调用 any() 两次,当只有 1 个 fastq 记录时会导致错误
  • 我会试试的。为什么 biopython 中 fasta 和 fastq 的方法不同?
  • @Chris_Rands 已更新,非常感谢
猜你喜欢
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 2021-05-16
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-03
相关资源
最近更新 更多