拆分带前缀的大型.gz文件

时间:2011-08-01 20:42:45

标签: python split gzip

我的每个fastq文件大约有2千万个读取(或2000万行)。现在我需要将大的fastq文件拆分成块,每个块只有100万次读取(或100万行),以便于进一步分析。 fastq文件就像.txt。

我的想法是,只计算一行,然后在计算每一百万行后打印出行。但输入文件是.gz压缩格式(fastq.gz),我需要先解压缩吗?

如何使用python执行此操作?

我尝试了以下命令:

zless XXX.fastq.gz |split -l 4000000 prefix

(先gzip然后拆分文件)

然而,似乎它不能使用前缀(我试过)“-prefix”,但它仍然不起作用。此外,使用split命令输出如下:

prefix-aa, prefix-ab...

如果我的前缀为XXX.fastq.gz,那么输出将为XXX.fastq.gzab,这会破坏.fastq.gz格式。

所以我需要的是XXX_aa.fastq.gz,XXX_ab.fastq.gz(即后缀)。我怎么能这样做?

3 个答案:

答案 0 :(得分:2)

  

......我需要先解压缩它。

不,你不,至少不是手工。 gzip将允许您打开压缩文件,此时您将读出一定数量的字节并将其写入单独的压缩文件。请参阅链接文档底部的示例,了解如何读取和写入压缩文件。

with gzip.open(infile, 'rb') as inp:
  for <some number of loops>:
    with gzip.open(outslice,'wb') as outp:
      outp.write(inp.read(slicesize))
  else: # only if you're not sure that you got the whole thing
    with gzip.open(outslice,'wb') as outp:
      outp.write(inp.read())

请注意,gzip压缩文件不是随机可访问的,因此您需要一次性执行操作,除非您想首先将源文件解压缩到磁盘。

答案 1 :(得分:1)

已发布here

zcat XXX.fastq.gz | split -l 1000000 --additional-suffix=".fastq" --filter='gzip > $FILE.gz' - "XXX_"

答案 2 :(得分:0)

您可以像解压缩文件一样阅读gzip压缩文件:

>>> import gzip
>>> for line in gzip.open('myfile.txt.gz', 'r'):
...   process(line)

process()函数将处理您提到的特定行计数和条件处理逻辑。