如何判断文件是否是gzip压缩的?

2024-05-23 21:30:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Python程序,它将以文本文件作为输入。但是,其中一些文件可能是gzip压缩的。

是否有一个跨平台的、可从Python中使用的方法来确定文件是否是gzip压缩的?

以下是可靠的还是一个普通的文本文件'意外'看起来像gzip足够让我得到误报?

try:
    gzip.GzipFile(filename, 'r')
    # compressed
    # ...
except:
    # not compressed
    # ...

Tags: 文件方法程序跨平台notfilenamecompressed文本文件
3条回答

是否有跨平台、可从Python方式确定文件是否是gzip压缩的

这个被接受的答案为我提供了相当可靠的解决方案的90%(测试前两个字节是否为1f 8b),但是没有展示如何在Python中实际做到这一点。以下是一种可能的方法:

import binascii

def is_gz_file(filepath):
    with open(filepath, 'rb') as test_f:
        return binascii.hexlify(test_f.read(2)) == b'1f8b'

导入mimetypes模块。 它可以自动猜测你有什么样的文件,如果它是压缩的。

mimetypes.guess_type('blabla.txt.gz')

返回:

('text/plain','gzip')

gzip压缩文件的magic number1f 8b。尽管这种测试不是百分之百可靠的,但是“普通文本文件”不太可能以UTF-8中的这两个字节开始,这甚至是不合法的。

不过,gzip压缩文件通常带有后缀.gz。即使是gzip(1)本身也不会在没有它的情况下解压缩文件,除非您--force将其解压缩到。你可以想象使用它,但是你仍然需要处理一个可能的IOError(无论如何你必须处理)。

您的方法的一个问题是,gzip.GzipFile()如果您给它一个未压缩的文件,它不会抛出异常。只有稍后的read()会。这意味着您可能需要两次实现某些程序逻辑。丑陋。

相关问题 更多 >