Perl | Perl读取gzip压缩文件

Posted 生信大讲堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl | Perl读取gzip压缩文件相关的知识,希望对你有一定的参考价值。

在我们平时使用Perl处理序列文件或者其他序列时可能会遇到压缩文件的情况,比如gzip(.gz)结尾的压缩文件。那么perl是如何读取.gz文件呢?

本期就将会介绍两种读取gz压缩文件的方法,并且在最后提供一个基于此的Perl程序。

首先我们来看我们的压缩文件的内容,内容如下:

 
   
   
 
  1. aaa

  2. bb

  3. ccc

  4. ddd


接下来就会依次介绍这两种方法。

方法一

方法一是基于Linux的管道,通过Linux的gzip命令读取压缩文件内容并通过管道作为Perl的输入流。经测试此种方法无法再Windows系统中使用。具体用法看代码:

 
   
   
 
  1. #!/usr/bin/perl

  2. open FH_IN, "gzip -dc $ARGV[0]|" or die("Cannot open such file ");  #文件句柄这里就是读取压缩文件与普通文件的区别所在

  3. while(<FH_IN>){

  4.        print $_;

  5. }

运行并查看结果:

Perl | Perl读取gzip压缩文件


这里也测试出了下面这种错误的用法:

 
   
   
 
  1. open FH_IN, '<', "gzip -dc $ARGV[0]|";

个人觉得错误原因在于管道已经指定了输入流,再使用“<”就会存在冲突,经检验确实会报错。具体机制有待讨论。


方法二

方法二是调用PerlIO::gzip模块来实现读取.gz压缩文件,其余并没什么区别,具体见代码:

 
   
   
 
  1. #!/usr/bin/perl

  2. use PerlIO::gzip;  #此处不可少

  3. open FH_IN, '<:gzip', $ARGV[0];

  4. while(<FH_IN>){

  5.        print $_;

  6. }

如果系统中不存在PerlIO::gzip会出现如下错误:

 
   
   
 
  1. [root@localhost test]# ./read_gz2.pl test.gz

  2. Can't locate PerlIO/gzip.pm in @INC (@INC contains: /root/perl5/lib/perl5/5.16.3/x86_64-linux-thread-multi /root/perl5/lib/perl5/5.16.3 /root/perl5/lib/perl5/x86_64-linux-thread-multi /root/perl5/lib/perl5 /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at ./read_gz2.pl line 2.

  3. BEGIN failed--compilation aborted at ./read_gz2.pl line 2.

直接使用cpan安装该模块即可。

 
   
   
 
  1. [root@localhost test]# cpan

  2. cpan[2]> install PerlIO::gzip.pm

下面就可以正常运行了。


 关于用法的部分就说到这里,下面提供了一个小编写的统计fastq文件中序列数据量的小脚本,仅供参考

 
   
   
 
  1. #!/usr/bin/perl

  2. use PerlIO::gzip;

  3. if(@ARGV != 1){

  4.    die("Usage: command <fastq file> ");

  5. }

  6. open FH_IN, '<:gzip', $ARGV[0] or die("Cannot open such file ");

  7. my $title;

  8. my $seq;

  9. my $plus;

  10. my $quality;

  11. my $volume = 0;

  12. while($title = <FH_IN>){

  13.    $seq = <FH_IN>;

  14.    chomp($seq);

  15.    $plus = <FH_IN>;

  16.    $quality = <FH_IN>;

  17.    if($title =~ /^@/ && $plus =~ /+/){

  18.        $volume += length($seq);

  19.    }  

  20.    else{

  21.        die("Error: error format! ");

  22.    }  

  23. }

  24. print "$ARGV[0] $volume ";


仅供参考。有问题也可以留言交流。



以上是关于Perl | Perl读取gzip压缩文件的主要内容,如果未能解决你的问题,请参考以下文章

perl 打开gz压缩文件 输出gz压缩文件

Perl 在打开 gzip 文件时给出“gzip:stdout:Broken pipe”错误,但前提是连接到数据库

Perl:使用 gzip 打开不存在的 gz 文件时,`die` 不起作用

perl pm文件如何安装

如何在 64 位 Perl 中解压缩(64 位)无符号长整数?

用 CGI 在 perl 中读取文件?