Как определить, сжат ли файл gzip?

У меня есть программа Python, которая будет принимать текстовые файлы в качестве входных данных. Однако некоторые из этих файлов могут быть сжаты gzip. Существует ли кросс-платформенная, используемая с Python способ определить, сжат ли файл gzip или нет? Является ли следующий надежный или обычный обычный текстовый файл «случайно» выглядит как gzip-подобный, достаточный для получения ложных срабатываний?

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

Спасибо, Райан

Магическое число для сжатых файлов gzip – 1f 8b . Хотя тестирование для этого не на 100% надежное, маловероятно, что «обычные текстовые файлы» начинаются с этих двух байтов в UTF-8, это даже не законно.

Как правило, сжатые файлы gzip имеют суффикс .gz . Даже сам gzip(1) не будет распаковывать файлы без него, если вы --force его. Вы могли бы использовать это, но вам все равно придется иметь дело с возможным IOError (что вам нужно в любом случае).

Одна из проблем с вашим подходом заключается в том, что gzip.GzipFile() не будет генерировать исключение, если вы подадите его в несжатый файл. Только более поздняя read() будет. Это означает, что вам, вероятно, придется дважды выполнить некоторую часть вашей программной логики. Некрасиво.

Импортируйте модуль mimetypes . Он может автоматически угадать, какой у вас файл, и если он сжат.

т.е.

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

возвращает:

('text / plain', 'gzip')

Кажется, что не работает в python3 …

 import mimetypes filename = "./datasets/test" def file_type(filename): type = mimetypes.guess_type(filename) return type print(file_type(filename)) 

возвращает (None, None) Но из команды unix "File"

: ~> файловые наборы данных / тестовые наборы данных / тест: сжатые данные gzip, был «iostat_collection», из Unix, последний изменен: чт 29 января 07:09:34 2015