我有大约1GB*.tbz文件。在每个文件中都有一个9GB的文件。我只需要读取这个文件的头,前1024个字节。
我希望这能尽快完成,因为我有数百个1GB的文件要处理。提取大约需要1m30s。
我尝试使用完全提取:
tar = tarfile.open(fn, mode='r|bz2')
for item in tar:
tar.extract(item)
和CCD_ 1,但没有速度改进:
tar = tarfile.open(fn, mode='r|bz2')
for member in tar.getmembers():
f = tar.extractfile(member)
headerbytes = f.read(1024)
headerdict = parseHeader(headerbytes)
getmembers()
方法在那里花费了所有的时间。
我有办法做到这一点吗?
我认为您应该使用标准库bz2
接口。.tbz
是使用-j
选项压缩的tar
文件的文件扩展名,用于指定bzip2
格式。
正如@bbayles在评论中指出的那样,您可以将文件作为bz2.BZ2File
打开,并使用seek
和tarfile.getmembers()
0:
读取([size])
读取最大大小的未压缩字节,返回为一串如果size参数为负数或被忽略,则读取直到EOF为已达到。
寻找(偏移[,从何处])
移动到新文件位置。参数偏移量是字节计数。
f = bz2.BZ2File(path)
f.seek(512)
headerbytes = f.read(1024)
然后,您可以使用函数解析它。
headerdict = parseHeader(headerbytes)
如果你确定每个tar档案都只包含一个bz2文件,那么在第一次读取tar文件时,你可以跳过前512个字节(当然不是其中包含的bz2),因为tar文件格式有一个填充的(固定大小)头,之后会存储你的"真实"内容。
一个简单的
f.seek(512)
与其在getmembers()上循环,不如这样做。