我的每个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(即后缀)。我怎么能这样做?
答案 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()
函数将处理您提到的特定行计数和条件处理逻辑。