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库也无法处理此问题:-(
答案 0 :(得分:6)
要获得与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
仅占用the first arbitrary extension,因此尚未进行排序,因此您会观察到不同的输出。
答案 1 :(得分:2)
尽管问题提到了mimetypes.guess_extension
,但实际上无法使用该模块中的信息来回答。 MIME类型到扩展名的映射是一对多的,mimetypes
数据库中没有权重信息,按字母顺序对扩展名进行排序可以给出一致的答案,但显然不是OP想要的。我考虑了以下选项:
根据权限,IANA DB没有每个扩展名的信息 类型,只有少数类型具有此信息,并且需要进行艰苦的分析。
按受欢迎程度,我希望有一个。
一致认为,一个名为"Incomplete list of MIME types"的MDN Wiki页面最接近:它得到了积极维护,它只列出了一些著名的mime类型的扩展名。
我认为实际的解决方案是,从上述MDN Wiki中获取表格,对这些类型进行硬编码,并使用mimetypes.guess_extension
作为后备。
请注意,您应该注意MDN content license。
答案 2 :(得分:0)
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
代表您想要的任何默认值。拥有默认字典可能更有意义。