Python 读取tarfile中的大文件头(~9GB),而不进行完全提取

Python 读取tarfile中的大文件头(~9GB),而不进行完全提取,python,large-files,bzip2,tarfile,Python,Large Files,Bzip2,Tarfile,我有~1GB*.tbz文件。每个文件中都有一个~9GB的文件。我只需要读取这个文件的头,前1024个字节 我希望这能尽快完成,因为我有数百个1GB的文件要处理。提取大约需要1m30秒 我尝试使用完全提取: tar = tarfile.open(fn, mode='r|bz2') for item in tar: tar.extract(item) 和tarfile.getmembers()但没有速度提升: tar = tarfile.open(fn, mode='r|bz2') for

我有~1GB*.tbz文件。每个文件中都有一个~9GB的文件。我只需要读取这个文件的头,前1024个字节

我希望这能尽快完成,因为我有数百个1GB的文件要处理。提取大约需要1m30秒

我尝试使用完全提取:

tar = tarfile.open(fn, mode='r|bz2')
for item in tar:
    tar.extract(item)
tarfile.getmembers()
但没有速度提升:

tar = tarfile.open(fn, mode='r|bz2')
for member in tar.getmembers():
    f = tar.extractfile(member)
    headerbytes = f.read(1024)
    headerdict = parseHeader(headerbytes)
getmembers()
方法一直在那里使用


有什么方法可以做到这一点吗?

如果您确定每个tar归档文件只包含一个bz2文件,那么在第一次读取tar文件(当然不是其中包含的bz2文件)时,您可以跳过前512个字节,因为tar文件格式有一个填充的(固定大小)头,然后存储“真实”内容

简单的

f.seek(512)

不要在getmembers()上循环。我认为应该使用标准库
bz2
接口
.tbz
是使用
-j
选项压缩的
tar
文件的文件扩展名,用于指定
bzip2
格式

正如注释中指出的,您可以将文件作为打开,并使用
seek
read

读取([大小])

读取最大大小的未压缩字节,返回为 一串如果size参数为负数或省略,请一直读取,直到EOF为 达到

寻道(偏移量[从何处])

移动到新文件位置。参数偏移量是一个 字节计数

然后可以用函数解析它

headerdict = parseHeader(headerbytes)

您可以显示需要解析的示例标题吗?您可以使用
读取
块吗?您可能可以完全跳过
tar
部分。谢谢!成功了!你想发布一个完整的答案吗?f=bz2.bz2文件(fn);f、 seek(512);磁头字节=f.read(1024);headerdict=parseHeader(headerbytes)谢谢!这是一个有用的答案,但不是一个完整的答案。谢谢你的完整答案塞巴斯蒂安@比尔斯首先领先。在你发布完整答案之前,我用他的评论解决了这个问题。我也想给他一些荣誉。你知道如何把他添加到你的答案中吗?
headerdict = parseHeader(headerbytes)