按前缀分割大型 .gz 文件
我有一些fastq文件,每个文件大约有2000万条读取数据(或者说2000万行)。现在我想把这些大文件分成小块,每块只有100万条读取数据(或者100万行),这样方便后续分析。fastq文件就像普通的.txt文件。
我想的办法是,先数一数行数,然后在每数到100万行的时候打印出来。但是,输入文件是.gz压缩格式(fastq.gz),我需要先解压吗?
我该怎么用python来实现这个呢?
我试过以下命令:
zless XXX.fastq.gz |split -l 4000000 prefix
(先解压再分割文件)
不过,似乎在使用前缀的时候不太管用(我试过)“-prefix”,还是不行。而且,用split命令输出的结果是:
prefix-aa, prefix-ab...
如果我的前缀是XXX.fastq.gz
,那么输出会变成XXX.fastq.gzab
,这样会破坏.gz格式。
所以我想要的格式是XXX_aa.fastq.gz,XXX_ab.fastq.gz(也就是后缀)。我该怎么做到呢?
3 个回答
0
你可以像读取普通文件一样读取一个经过压缩的gz文件:
>>> import gzip
>>> for line in gzip.open('myfile.txt.gz', 'r'):
... process(line)
这里的process()
函数会处理你提到的具体行数统计和条件处理的逻辑。
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压缩的文件不能随机访问,所以你必须一次性完成这个操作,除非你先把源文件解压到硬盘上。
3
如在这里所述
zcat XXX.fastq.gz | split -l 1000000 --additional-suffix=".fastq" --filter='gzip > $FILE.gz' - "XXX_"