Perl | Perl读取gzip压缩文件
Posted 生信大讲堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Perl | Perl读取gzip压缩文件相关的知识,希望对你有一定的参考价值。
在我们平时使用Perl处理序列文件或者其他序列时可能会遇到压缩文件的情况,比如gzip(.gz)结尾的压缩文件。那么perl是如何读取.gz文件呢?
本期就将会介绍两种读取gz压缩文件的方法,并且在最后提供一个基于此的Perl程序。
首先我们来看我们的压缩文件的内容,内容如下:
aaa
bb
ccc
ddd
接下来就会依次介绍这两种方法。
方法一
方法一是基于Linux的管道,通过Linux的gzip命令读取压缩文件内容并通过管道作为Perl的输入流。经测试此种方法无法再Windows系统中使用。具体用法看代码:
#!/usr/bin/perl
open FH_IN, "gzip -dc $ARGV[0]|" or die("Cannot open such file "); #文件句柄这里就是读取压缩文件与普通文件的区别所在
while(<FH_IN>){
print $_;
}
运行并查看结果:
这里也测试出了下面这种错误的用法:
open FH_IN, '<', "gzip -dc $ARGV[0]|";
个人觉得错误原因在于管道已经指定了输入流,再使用“<”就会存在冲突,经检验确实会报错。具体机制有待讨论。
方法二
方法二是调用PerlIO::gzip模块来实现读取.gz压缩文件,其余并没什么区别,具体见代码:
#!/usr/bin/perl
use PerlIO::gzip; #此处不可少
open FH_IN, '<:gzip', $ARGV[0];
while(<FH_IN>){
print $_;
}
如果系统中不存在PerlIO::gzip会出现如下错误:
[root@localhost test]# ./read_gz2.pl test.gz
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.
BEGIN failed--compilation aborted at ./read_gz2.pl line 2.
直接使用cpan安装该模块即可。
[root@localhost test]# cpan
cpan[2]> install PerlIO::gzip.pm
下面就可以正常运行了。
关于用法的部分就说到这里,下面提供了一个小编写的统计fastq文件中序列数据量的小脚本,仅供参考。
#!/usr/bin/perl
use PerlIO::gzip;
if(@ARGV != 1){
die("Usage: command <fastq file> ");
}
open FH_IN, '<:gzip', $ARGV[0] or die("Cannot open such file ");
my $title;
my $seq;
my $plus;
my $quality;
my $volume = 0;
while($title = <FH_IN>){
$seq = <FH_IN>;
chomp($seq);
$plus = <FH_IN>;
$quality = <FH_IN>;
if($title =~ /^@/ && $plus =~ /+/){
$volume += length($seq);
}
else{
die("Error: error format! ");
}
}
print "$ARGV[0] $volume ";
仅供参考。有问题也可以留言交流。
以上是关于Perl | Perl读取gzip压缩文件的主要内容,如果未能解决你的问题,请参考以下文章
Perl 在打开 gzip 文件时给出“gzip:stdout:Broken pipe”错误,但前提是连接到数据库
Perl:使用 gzip 打开不存在的 gz 文件时,`die` 不起作用