如何获取gzip压缩文件的随机访问权限

时间:2014-04-08 23:18:15

标签: python indexing gzip random-access

根据this FAQ on zlib.net,可以:

  

在压缩流中随机访问数据

我知道Biopyton 1.60的Bio.bgzf模块,其中:

  

支持读取和写入BGZF文件(Blocked GNU Zip Format),这是GZIP的一种变体,具有高效的随机访问,最常用作BAM文件格式的一部分,并且在tabix中。这在内部使用Python的zlib库,并提供了一个简单的接口,如Python的gzip库。

但是对于我的用例,我不想使用那种格式。基本上我想要一些东西,它模仿下面的代码:

import gzip
large_integer_new_line_start = 10**9
with gzip.open('large_file.gz','rt') as f:
    f.seek(large_integer_new_line_start)

但是本机zlib.net提供的效率可以提供对压缩流的随机访问。如何利用Python中的随机访问功能?

4 个答案:

答案 0 :(得分:5)

我放弃了使用Python对gzip压缩文件进行随机访问。相反,我在命令行上将我的gzip压缩文件转换为带有block compression/decompression utility的块gzip压缩文件:

zcat large_file.gz | bgzip > large_file.bgz

然后我使用BioPython并告诉我获取bgzipped文件的行号为100万的virtual_offset。之后我能够迅速寻找virtual_offset:

from Bio import bgzf

file='large_file.bgz'

handle = bgzf.BgzfReader(file)
for i in range(10**6):
    handle.readline()
virtual_offset = handle.tell()
line1 = handle.readline()
handle.close()

handle = bgzf.BgzfReader(file)
handle.seek(virtual_offset)
line2 = handle.readline()
handle.close()

assert line1==line2

我还想在SO answer by Mark Adler发行版中指向examples/zran.c上的zlib

答案 1 :(得分:0)

您正在寻找dictzip.py serpento包的一部分。但是,您必须使用dictzip压缩文件,gzip$("#key").click(function() { $("div").css("text-align", "center"); }); 压缩的随机可搜索向后兼容变体。

答案 2 :(得分:0)

indexed_gzip程序可能就是您想要的。它还在引擎盖下使用zran.c

答案 3 :(得分:-4)

如果您只是想从随机点访问该文件,您不能这样做:

from random import randint

with open(filename) as f:
    f.seek(0, 2)
    size = f.tell()
    f.seek(randint(0, size), 2)