【问题标题】:Printing sequences of a FASTA file using BioPerl使用 BioPerl 打印 FASTA 文件的序列
【发布时间】:2014-08-02 15:30:19
【问题描述】:

我有这个代码

use warnings;
use Getopt::Long;
use Bio::SeqIO;

GetOptions("in=s" => \$file) or die("Error in command line arguments\n");
open $new3, ">", "sequences_tmp.tab";
$seqin = Bio::SeqIO->new(-file => $file, -format => "Fasta");
$seqout = Bio::SeqIO->new(-file => ">$new3", -format => "tab");

while ($seq = $seqin->next_seq()) {
    $seqout->width($seq->length);
    $obj = $seq->id ."\t".$seq->seq()."\n";
    $seqout->write_seq($obj);
}

close $new3;

希望以这种方式打印序列seq_id TAB sequence。但是,此代码打印一个空文件。你知道发生了什么事吗?

【问题讨论】:

  • 文档建议 -file 标志需要文件名而不是文件句柄
  • 你应该总是 use strictuse warnings 在你的 Perl 程序的顶部。当您在代码方面寻求帮助时,只有利用这种明显的帮助来调试语言本身是一种礼貌。您还应该测试每个open 调用是否成功,并使用die 字符串覆盖$! 内置变量,以便清楚为什么操作失败。在许多情况下,最简单的方法是简单地 use autodie,此时将隐式包含必要的检查

标签: perl bioperl


【解决方案1】:

$obj 变量在我看来毫无用处。它是一个字符串,而不是一个序列对象。由于您只想重新格式化序列,您可以简单地将$seq 传递给write_seq() 方法。

所以我想知道你是否正在执行循环体。您可以打印调试输出以进行验证。如果没有执行循环体,请确保您的输入文件确实包含 FASTA 格式的序列。

另外,请在您的脚本顶部声明use strict;。它将帮助您避免许多陷阱。

【讨论】:

    【解决方案2】:

    您打开一个文件句柄$new3,然后将其字符串化并将其用作-file 参数中的文件名。这是一个错误。

    open $new3, ">", "sequences_tmp.tab";
    $seqout = Bio::SeqIO->new(
        -file    => ">$new3",      # <--- Not what you want
        -format  => "tab",
    );
    

    Bio::SeqIO-&gt;new 可以接受文件句柄-fh 或文件名-file 作为初始化参数。因此,以下任何一项都可能适合您:

    my $seqout = Bio::SeqIO->new(
        -fh      => $new3,
        -format  => "tab",
    );
    
          #or#
    
    my $seqout = Bio::SeqIO->new(
        -file    => '>sequences_tmp.tab',
        -format  => "tab",
    );
    

    您的代码也可以进一步清理:

    应用这些并从代码中删除可能的调试工件会将其减少到:

    use strict;
    use warnings;
    use autodie;
    
    use Getopt::Long;
    use Bio::SeqIO;
    
    GetOptions(
        "in=s"    => \my $infile,
    ) or die "Error in command line arguments\n";
    
    my $outfile = "sequences_tmp.tab";
    
    my $seqin  = Bio::SeqIO->new(-file => $infile,     -format => "Fasta");
    my $seqout = Bio::SeqIO->new(-file => ">$outfile", -format => "tab");
    
    while (my $seq = $seqin->next_seq()) {
        $seqout->write_seq($seq);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      相关资源
      最近更新 更多