正确区分压缩的.gz文件和存档的tar.gz文件?

dcm棕色

解决区分gzip或bzip2格式的普通压缩文件(例如.gz)和使用gzip或bzip2压缩的tarball(例如.tar.gz)的正确方法是什么,使用后缀扩展名进行识别不是一个可靠的选择因为有可能文件最终可能会被重命名。

现在,在命令行上,我可以执行以下操作:

bzip2 -dc test.tar.bz2 |head|file -

因此,我尝试使用以下功能在python中进行类似操作:

def get_magic(self, store_file, buffer=False, look_deeper=False):
    # see what we're indexing
    if look_deeper == True:
        m = magic.Magic(mime=True, uncompress=True)
    else:
        m = magic.Magic(mime=True) 

    if buffer == False:
        try:
            file_type = m.from_file(store_file)

        except Exception, e:
            raise e

    else:
        try:
            file_type = m.from_buffer(store_file)

        except Exception, e:
            raise e

    return file_type 

然后,当尝试读取压缩的tarball时,我将通过以下方式从其他地方传递缓冲区:

    file_buffer = open(file_name).read(8096) 
    archive_check = self.get_magic(file_buffer, True, True)

不幸的是,这随后在python-magic中使用uncompress标志变得有问题,因为似乎python-magic期望我传递整个文件,即使我只希望它读取缓冲区。我最终遇到了一个例外:

bzip2 ERROR: Compressed file ends unexpectedly

看到我正在查看的文件的大小最终可能是2M到20GB,这变得相当成问题。不想读取整个文件

可以将其砍死并砍掉压缩文件的末尾并将其附加到缓冲区吗?是否最好忽略使用python-magic解压缩文件的想法,而是在传递缓冲区以通过以下方式进行识别之前执行此操作:

    file_buffer = open(file_name, "r:bz2").read(8096) 

有没有更好的办法?

马克·阿德勒

如果偏移量257处的未压缩数据为“ ustar”,或者如果未压缩数据的整体为1024个零字节(空tar文件),则很可能是tar文件

您可以使用z = zlib.decompressobj()z = bz2.BZ2Decompressor()来仅读取未压缩数据的前1024个字节z.decompress()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档