2024-05-23 21:30:12 发布
网友
我有一个Python程序,它将以文本文件作为输入。但是,其中一些文件可能是gzip压缩的。
是否有一个跨平台的、可从Python中使用的方法来确定文件是否是gzip压缩的?
以下是可靠的还是一个普通的文本文件'意外'看起来像gzip足够让我得到误报?
try: gzip.GzipFile(filename, 'r') # compressed # ... except: # not compressed # ...
是否有跨平台、可从Python方式确定文件是否是gzip压缩的
这个被接受的答案为我提供了相当可靠的解决方案的90%(测试前两个字节是否为1f 8b),但是没有展示如何在Python中实际做到这一点。以下是一种可能的方法:
1f 8b
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 number是1f 8b。尽管这种测试不是百分之百可靠的,但是“普通文本文件”不太可能以UTF-8中的这两个字节开始,这甚至是不合法的。
不过,gzip压缩文件通常带有后缀.gz。即使是gzip(1)本身也不会在没有它的情况下解压缩文件,除非您--force将其解压缩到。你可以想象使用它,但是你仍然需要处理一个可能的IOError(无论如何你必须处理)。
.gz
gzip(1)
--force
您的方法的一个问题是,gzip.GzipFile()如果您给它一个未压缩的文件,它不会抛出异常。只有稍后的read()会。这意味着您可能需要两次实现某些程序逻辑。丑陋。
gzip.GzipFile()
read()
是否有跨平台、可从Python方式确定文件是否是gzip压缩的
这个被接受的答案为我提供了相当可靠的解决方案的90%(测试前两个字节是否为
1f 8b
),但是没有展示如何在Python中实际做到这一点。以下是一种可能的方法:导入mimetypes模块。 它可以自动猜测你有什么样的文件,如果它是压缩的。
即
返回:
('text/plain','gzip')
gzip压缩文件的magic number是
1f 8b
。尽管这种测试不是百分之百可靠的,但是“普通文本文件”不太可能以UTF-8中的这两个字节开始,这甚至是不合法的。不过,gzip压缩文件通常带有后缀
.gz
。即使是gzip(1)
本身也不会在没有它的情况下解压缩文件,除非您--force
将其解压缩到。你可以想象使用它,但是你仍然需要处理一个可能的IOError(无论如何你必须处理)。您的方法的一个问题是,
gzip.GzipFile()
如果您给它一个未压缩的文件,它不会抛出异常。只有稍后的read()
会。这意味着您可能需要两次实现某些程序逻辑。丑陋。相关问题 更多 >
编程相关推荐