区分 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)
有没有更好的办法?