Тип содержимого text / plain имеет расширение .ksh? - PullRequest
0 голосов
/ 29 ноября 2018

Python 2.7:

>>> from mimetypes import guess_extension
>>> guess_extension('text/plain')
'.ksh'

Python 3.5:

>>> from mimetypes import guess_extension
>>> guess_extension('text/plain')
'.c'

Как я могу получить правильный ответ?

Для меня подойдет ".txt".

Даже filetype lib не может справиться с этим :-(

См. https://github.com/h2non/filetype.py/issues/30

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

guess_extension просто делает что-то вроде:

for x in mt.types_map:
    if mt.types_map[x] == 'text/plain': 
        return x

Поскольку существует несколько расширений, которые могут быть связаны с текстовыми файлами, на самом деле нет ничего лучше, чем можно сделать (без некоторого априорного знания,что может иметь или не иметь смысла для большинства из нас).Таким образом, единственным способом добиться этой работы являются некоторые обходные пути при сортировке или выборе нужного расширения вручную.Я бы порекомендовал просто включить функцию, которая имеет больше смысла - вы принимаете расширение по умолчанию (я думаю), а не предположение.Поэтому я бы, вероятно, жестко запрограммировал что-то вроде:

def default_extension(type):
     if type == 'text/plain': return '.txt'
     return mt.guess_extension(type)

с if для любого значения по умолчанию, которое вы хотите.Возможно, было бы разумнее иметь словарь по умолчанию.

0 голосов
/ 10 декабря 2018

хотя вопрос упоминается mimetypes.guess_extension, но на самом деле на него нельзя ответить с помощью информации в этом модуле.Отображение типа mime в расширение - одно в несколько, в базе данных mimetypes нет информации о весе, сортировка расширений по алфавиту может дать последовательный ответ, но, очевидно, не то, что хочет OP.Я рассмотрел следующие варианты:

  • по полномочиям, IANA DB не имеет информации о расширении для каждого типа, только несколько типов имеют эту информацию и нуждаются в тяжелой работе, чтобыparse.

  • по популярности, я надеюсь, что есть один.

  • по общему мнению, вики-страница MDN с именем "Неполный списокMIME types " наиболее близок: он активно поддерживается, в нем перечислено только одно расширение для какого-то известного типа MIME.

Полагаю, практическое решение заключается в том, чтобы взять таблицуиз вышеупомянутой MDN wiki, жестко закодируйте эти типы, используйте mimetypes.guess_extension в качестве запасного.

обратите внимание, что вам следует позаботиться о лицензии на контент MDN .

0 голосов
/ 29 ноября 2018

Чтобы получить согласованные выходные данные с Python 3 и 2, вам нужно использовать guess_all_extensions и отсортировать вывод:

>>> from mimetypes import guess_all_extensions
>>> sorted(guess_all_extensions('text/plain'))
['.asc', '.bat', '.c', '.cc', '.conf', '.cxx', '.el', '.f90', '.h', '.hh', '.hxx', '.ksh', '.log', '.pl', '.pm', '.text', '.txt']

.txt - последний элемент.

Это своего родастранно, что они еще не отсортированы, поскольку guess_extension просто принимает первое произвольное расширение , следовательно, вы наблюдаете различные результаты.

...