Как определить тип содержимого строки - PullRequest
2 голосов
/ 20 января 2011

Я получаю некоторые данные в виде строки. Мне нужно записать данные в файл, но проблема в том, что иногда данные сжимаются / архивируются, а иногда это просто текст. Мне нужно определить тип содержимого, чтобы я знал, следует ли записать его в файл .txt или файл .tgz. Есть идеи, как этого добиться? Могу ли я как-нибудь использовать mime-тип, хотя мои данные - это строка, а не файл?

Спасибо.

Ответы [ 4 ]

1 голос
/ 21 января 2011

Как уже предлагалось в некоторых ответах, вы можете заглянуть в первые байты файла:

#!/usr/bin/env python

# $ cat hello.txt
# Hello World. I'm plaintext.

# $ cat hello.txt | gzip > hello.txt.gz

from struct import unpack

# 1F 8B 08 00 / gz magic number
magic = ('\x1f', '\x8b', '\x08', '\x00')

for filename in ['hello.txt', 'hello.txt.gz']:
    with open(filename, 'rb') as handle:
        s = unpack('cccc', handle.read(4))
        if s == magic:
            print filename, 'seems gzipped'
        else:
            print filename, 'seems not gzipped'

# =>
# hello.txt seems not gzipped
# hello.txt.gz seems gzipped
1 голос
/ 21 января 2011

Если файл загружен с веб-сервера, у вас должен быть тип содержимого для просмотра, однако вы зависите от веб-сервера, независимо от того, действительно ли он описывает тип файла.

Другой альтернативой может быть использование эвристики для угадывания типа файла. Это часто можно сделать, посмотрев на первые несколько байтов файла

1 голос
/ 21 января 2011

И gzip, и zip используют разные заголовки перед сжатыми данными, что маловероятно для строк, читаемых человеком. Если выбор только между ними, вы можете выполнить более быструю проверку, чем mimetypes.

0 голосов
/ 20 января 2011

Вы можете попробовать модуль mimetypes: http://docs.python.org/library/mimetypes.html.

Вот что поиграть:

print mimetypes.guess_type(filename)

Удачи!

...