基于共享mime信息的zope mime类型猜测框架

z3c.sharedmimeinfo的Python项目详细描述


z3c.sharedmimeinfo

此包提供一个实用程序,用于根据文件名猜测mime类型和/或 实际内容。它基于freedesktop.org的共享mime信息数据库。

Shared MIME info database

shared-mime-info 是一个通用mime类型的可扩展数据库。它提供了强大的mime类型 检测机制以及多语种类型描述。

此软件包要求安装并访问共享的mime信息。这个 最简单的方法是在系统范围内安装它,例如安装 ubuntu上的shared-mime-info包。specification还描述了 安装和扩展数据库的其他方法。

Thread-safety

注意,这个包目前不是线程安全的,因为数据意味着 仅在模块导入时加载一次。如果有什么问题是因为 那,将来可能会改变。

MIME type guessing

使用此包的最简单方法是从 根模块:

>>> from z3c.sharedmimeinfo import getType

此函数尝试猜测共享mime信息中指定的mime类型 规范文档并始终返回一些可用的mime类型,使用 应用程序/八位字节流或文本/纯文本作为回退。它可以通过 文件名、其内容或两者,因此它接受两个参数:file name(string) 和/或文件(类似文件的对象)。至少应该给其中一个。

如上所述,它至少需要一个论点,所以你不能不说 参数:

>>> getType()
Traceback (most recent call last):
...
TypeError: Either filename or file should be provided or both of them

通过filename参数传递文件名:

>>> print getType(filename='document.doc')
application/msword

通过file参数传递文件内容,该参数接受如下文件 反对。让我们使用testing helper函数打开一个示例文件并尝试 要猜出它的类型:

>>> print getType(file=openSample('png'))
image/png

如果无法检测到mime类型,text/plainapplication/octet-stream将被返回。函数将尝试猜测 检查前32个字节是文本还是二进制:

>>> print getType(filename='somefile', file=openSample('text'))
text/plain

>>> print getType(filename='somefile', file=openSample('binary'))
application/octet-stream

MIME type objects

getType和其他函数(见下文)返回的对象实际上是 一个扩展的unicode字符串对象,提供有关mime的附加信息 键入。它们提供imimimetype接口:

>>> from zope.interface.verify import verifyObject
>>> from z3c.sharedmimeinfo.interfaces import IMIMEType

>>> mt = getType(filename='document.doc')
>>> verifyObject(IMIMEType, mt)
True

因为它们实际上是Unicode对象,所以可以像字符串一样进行比较:

>>> mt == 'application/msword'
True

它们还提供mediasubtype属性:

>>> mt.media
u'application'

>>> mt.subtype
u'msword'

最后,它们提供了title属性,该属性是可翻译的 消息:

>>> mt.title
u'application/msword'

>>> from zope.i18nmessageid.message import Message
>>> isinstance(mt.title, Message)
True

让我们检查一下共享mime信息的i18n特性 受此软件包支持。如上所示,mime类型标题消息id是 实际上它是<;media>;/<;subtype>;,但是如果我们翻译它,我们将得到 人性化字符串:

>>> from zope.i18n import translate

>>> translate(mt.title)
u'Word document'

>>> translate(mt.title, target_language='ru')
u'\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442 Word'

>>> from z3c.sharedmimeinfo.mimetype import MIMEType

我们还可以使用mimetype类手工创建imimimetype对象:

>>> from z3c.sharedmimeinfo.mimetype import MIMEType

我们可以创建它们,将媒体和子类型指定为两个参数或单个参数 “media/subtype”表单中的参数:

>>> MIMEType('text/plain')
<MIMEType text/plain>

>>> MIMEType('image', 'png')
<MIMEType image/png>

注意,mimetype对象是缓存的,因此如果要创建另一个 对象对于相同的mime类型,您将得到相同的对象:

>>> mt = MIMEType('text/plain')
>>> mt2 = MIMEType('text/plain')
>>> mt2 is mt
True

Advanced usage

上面描述的getType函数实际上是 imimetypesutability对象。imimetypesutability是 猜测mime类型。

让我们直接导入实用程序并使用它:

>>> from z3c.sharedmimeinfo.utility import mimeTypesUtility

>>> from z3c.sharedmimeinfo.interfaces import IMIMETypesUtility
>>> verifyObject(IMIMETypesUtility, mimeTypesUtility)
True

它有三种获取mime类型的方法。这三种方法是 getType(如上所述),getTypeByFileNamegetTypeByContents

Detection by file name

mime types实用程序的getTypeByFileName方法查找类型 按文件名:

>>> mt = mimeTypesUtility.getTypeByFileName('example.doc')

共享mime信息数据库非常好,它甚至可以检测 文件名,如Makefile

>>> print mimeTypesUtility.getTypeByFileName('Makefile')
text/x-makefile

同时,它也知道分机字母大小写的区别。例如.C 应该被检测为C++文件,当^ {tt18}$是普通C文件:

>>> print mimeTypesUtility.getTypeByFileName('hello.C')
text/x-c++src

>>> print mimeTypesUtility.getTypeByFileName('main.c')
text/x-csrc

如果无法从文件名中确定类型,该方法将返回None

>>> print mimeTypesUtility.getTypeByFileName('somefilename')
None

Detection by contents

getTypeByContents方法接受一个类似文件的对象和两个可选的 参数:可用于指定范围的最小优先级和最大优先级 使用的“魔法”规则。默认情况下,最小优先级为0,最大优先级为 100,所以所有的规则都将被使用。请参阅的共享mime信息规范 细节。

我们有一些应该由内容检测的示例文件:

>>> fdoc = openSample('doc')
>>> print mimeTypesUtility.getTypeByContents(fdoc)
application/msword

>>> fhtml = openSample('html')
>>> print mimeTypesUtility.getTypeByContents(fhtml)
text/html

>>> fpdf = openSample('pdf')
>>> print mimeTypesUtility.getTypeByContents(fpdf)
application/pdf

>>> fpng = openSample('png')
>>> print mimeTypesUtility.getTypeByContents(fpng)
image/png

如果我们传递的文件没有任何已知的魔法字节,它将返回None

>>> funknown = openSample('binary')
>>> print mimeTypesUtility.getTypeByContents(funknown)
None

>>> del fdoc, fhtml, fpdf, fpng, funknown

CHANGES

0.1.0(2009-09-08)

  • 初次发布。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java如何在用户输入的基础上使用applet绘制线条?在g为null的状态下发生的错误,如何修复   java频率源   java无法单击使用Selenium WebDriver创建的<div>下拉列表   java Wildfly 15在不同的机器上运行时不创建集群   Java:比较3个数字。得到他们中最伟大的   java与Maven/Hudson和TestNG一起使用多个类   java发生JNI错误(jdeveloper12c)   java在现实生活中同步多线程程序中的方法有什么意义   java Glassfish嵌入式JNDI模块范围查找   windows使用WMIC优雅地杀死Java进程   午夜(上午12点)java更新小部件失败   java无法解析方法“registerListener(com.xxx.xxx.MainActivity,安卓.hardware.SensorManager,int)”   java Hibernate版本属性在更改时调用自动更新?   java创建新线程是否会产生刷新缓存的副作用?   java saveAsTextFile性能改进   java如何自动化新的Facebook注册弹出窗口?   来自现有RDD的java Spark流媒体   AES256 OpenSSL C++和java加密:解密时的BADPADION异常