mimetypes — 将文件名映射到 MIME 类型

源代码: Lib/mimetypes.py


mimetypes 模块在文件名或 URL 与和文件扩展名相关联的 MIME 类型之间进行转换。提供了从文件名到 MIME 类型以及从 MIME 类型到文件扩展名的转换;后一种转换不支持编码。

该模块提供了一个类和一些便捷函数。这些函数是该模块的常规接口,但某些应用程序可能也对该类感兴趣。

下面描述的函数提供了该模块的主要接口。如果模块尚未初始化,并且它们依赖于 init() 设置的信息,它们将调用 init()

mimetypes.guess_type(url, strict=True)

根据文件名、路径或 URL(由 url 给出)猜测文件类型。URL 可以是字符串或 类路径对象

返回值是一个元组 (type, encoding),其中如果无法猜测类型(后缀缺失或未知),typeNone,否则为 'type/subtype' 形式的字符串,可用于 MIME content-type 标头。

encoding 对于无编码情况为 None,或者是用于编码的程序名称(例如 compressgzip)。该编码适用于作为 Content-Encoding 标头,适用于 Content-Transfer-Encoding 标头。映射是表驱动的。编码后缀是大小写敏感的;类型后缀首先尝试大小写敏感匹配,然后尝试大小写不敏感匹配。

可选的 strict 参数是一个标志,指定已知 MIME 类型的列表是否仅限于 在 IANA 注册 的官方类型。但是,此模块的行为也取决于底层的操作系统。只有操作系统识别的或在 Python 内部数据库中明确注册的文件类型才能被识别。当 strictTrue(默认值)时,仅支持 IANA 类型;当 strictFalse 时,还会识别一些额外的非标准但常用的 MIME 类型。

在 3.8 版更改: 添加了对 url类路径对象 的支持。

从 3.13 版起弃用: 传入文件路径而非 URL 的做法已被软弃用。请改用 guess_file_type()

mimetypes.guess_file_type(path, *, strict=True)

根据文件路径(由 path 给出)猜测文件类型。与 guess_type() 函数类似,但接受路径而不是 URL。路径可以是字符串、字节对象或 类路径对象

在 3.13 版本加入。

mimetypes.guess_all_extensions(type, strict=True)

根据文件的 MIME 类型(由 type 给出)猜测其扩展名。返回值是一个字符串列表,给出所有可能的文件扩展名,包括前导点('.')。不保证这些扩展名与任何特定数据流相关联,但会被 guess_type()guess_file_type() 映射到 MIME 类型 type

可选的 strict 参数与 guess_type() 函数中的含义相同。

mimetypes.guess_extension(type, strict=True)

根据文件的 MIME 类型(由 type 给出)猜测其扩展名。返回值是一个字符串,给出一个文件扩展名,包括前导点('.')。不保证该扩展名与任何特定数据流相关联,但会被 guess_type()guess_file_type() 映射到 MIME 类型 type。如果无法为 type 猜测到扩展名,则返回 None

可选的 strict 参数与 guess_type() 函数中的含义相同。

还提供一些额外的函数和数据项来控制模块的行为。

mimetypes.init(files=None)

初始化内部数据结构。如果给出 files,它必须是一个文件名序列,用于扩充默认的类型映射。如果省略,则使用的文件名取自 knownfiles;在 Windows 上,会加载当前的注册表设置。在 filesknownfiles 中命名的每个文件都优先于其前面命名的文件。允许重复调用 init()

files 指定一个空列表将阻止应用系统默认值:只有内置列表中的已知值会存在。

如果 filesNone,内部数据结构将被完全重建为其初始默认值。这是一个稳定的操作,多次调用会产生相同的结果。

在 3.2 版更改: 以前,Windows 注册表设置被忽略。

mimetypes.read_mime_types(filename)

如果文件 filename 存在,则加载其中给出的类型映射。类型映射作为字典返回,将文件扩展名(包括前导点 '.')映射到 'type/subtype' 形式的字符串。如果文件 filename 不存在或无法读取,则返回 None

mimetypes.add_type(type, ext, strict=True)

添加从 MIME 类型 type 到扩展名 ext 的映射。当扩展名已知时,新的类型将替换旧的类型。当类型已知时,扩展名将被添加到已知扩展名列表中。

strictTrue(默认值)时,映射将添加到官方 MIME 类型中,否则添加到非标准类型中。

mimetypes.inited

标志,指示全局数据结构是否已初始化。该值由 init() 设置为 True

mimetypes.knownfiles

常用安装的类型映射文件名列表。这些文件通常命名为 mime.types,并由不同的软件包安装在不同的位置。

mimetypes.suffix_map

将后缀映射到后缀的字典。这用于允许识别那些编码和类型由相同扩展名指示的已编码文件。例如,.tgz 扩展名被映射到 .tar.gz,以允许分别识别编码和类型。

mimetypes.encodings_map

将文件扩展名映射到编码类型的字典。

mimetypes.types_map

将文件扩展名映射到 MIME 类型的字典。

mimetypes.common_types

将文件扩展名映射到非标准但常见的 MIME 类型的字典。

该模块的一个用法示例

>>> import mimetypes
>>> mimetypes.init()
>>> mimetypes.knownfiles
['/etc/mime.types', '/etc/httpd/mime.types', ... ]
>>> mimetypes.suffix_map['.tgz']
'.tar.gz'
>>> mimetypes.encodings_map['.gz']
'gzip'
>>> mimetypes.types_map['.tgz']
'application/x-tar-gz'

MimeTypes 对象

MimeTypes 类可能对那些希望拥有多个 MIME 类型数据库的应用程序有用;它提供了与 mimetypes 模块类似的接口。

class mimetypes.MimeTypes(filenames=(), strict=True)

此类表示一个 MIME 类型数据库。默认情况下,它提供对与此模块其余部分相同的数据库的访问。初始数据库是模块提供的数据库的副本,并可以通过使用 read()readfp() 方法将额外的 mime.types 样式文件加载到数据库中来扩展。如果不需要默认数据,也可以在加载额外数据之前清除映射字典。

可选的 filenames 参数可用于在默认数据库之上加载其他文件。

suffix_map

将后缀映射到后缀的字典。这用于允许识别那些编码和类型由相同扩展名指示的已编码文件。例如,.tgz 扩展名被映射到 .tar.gz,以允许分别识别编码和类型。这最初是模块中定义的全局 suffix_map 的副本。

encodings_map

将文件扩展名映射到编码类型的字典。这最初是模块中定义的全局 encodings_map 的副本。

types_map

包含两个字典的元组,将文件扩展名映射到 MIME 类型:第一个字典用于非标准类型,第二个字典用于标准类型。它们由 common_typestypes_map 初始化。

types_map_inv

包含两个字典的元组,将 MIME 类型映射到文件扩展名列表:第一个字典用于非标准类型,第二个字典用于标准类型。它们由 common_typestypes_map 初始化。

guess_extension(type, strict=True)

guess_extension() 函数类似,使用作为对象一部分存储的表。

guess_type(url, strict=True)

guess_type() 函数类似,使用作为对象一部分存储的表。

guess_file_type(path, *, strict=True)

guess_file_type() 函数类似,使用作为对象一部分存储的表。

在 3.13 版本加入。

guess_all_extensions(type, strict=True)

guess_all_extensions() 函数类似,使用作为对象一部分存储的表。

read(filename, strict=True)

从名为 filename 的文件中加载 MIME 信息。这使用 readfp() 来解析文件。

如果 strictTrue,信息将添加到标准类型列表中,否则添加到非标准类型列表中。

readfp(fp, strict=True)

从打开的文件 fp 加载 MIME 类型信息。该文件必须具有标准 mime.types 文件的格式。

如果 strictTrue,信息将添加到标准类型列表中,否则添加到非标准类型列表中。

read_windows_registry(strict=True)

从 Windows 注册表加载 MIME 类型信息。

可用性: Windows。

如果 strictTrue,信息将添加到标准类型列表中,否则添加到非标准类型列表中。

在 3.2 版本加入。

add_type(type, ext, strict=True)

添加从 MIME 类型 type 到扩展名 ext 的映射。有效的扩展名以‘.’开头或是空的。当扩展名已知时,新的类型将替换旧的类型。当类型已知时,扩展名将被添加到已知扩展名列表中。

strictTrue(默认值)时,映射将添加到官方 MIME 类型中,否则添加到非标准类型中。

自 3.14 版起弃用,将在 3.16 版中移除: 在 Python 3.16 中,无效的、不带点的扩展名将引发 ValueError

命令行用法

mimetypes 模块可以作为脚本从命令行执行。

python -m mimetypes [-h] [-e] [-l] type [type ...]

接受以下选项

-h
--help

显示帮助信息并退出。

-e
--extension

猜测扩展名而不是类型。

-l
--lenient

额外搜索一些常见的但非标准的类型。

默认情况下,该脚本将 MIME 类型转换为文件扩展名。但是,如果指定了 --extension,它会将文件扩展名转换为 MIME 类型。

对于每个 type 条目,脚本会向标准输出流写入一行。如果出现未知类型,它会向标准错误流写入一条错误消息,并以返回码 1 退出。

命令行示例

以下是 mimetypes 命令行界面的典型用法示例

$ # get a MIME type by a file name
$ python -m mimetypes filename.png
type: image/png encoding: None

$ # get a MIME type by a URL
$ python -m mimetypes https://example.com/filename.txt
type: text/plain encoding: None

$ # get a complex MIME type
$ python -m mimetypes filename.tar.gz
type: application/x-tar encoding: gzip

$ # get a MIME type for a rare file extension
$ python -m mimetypes filename.pict
error: unknown extension of filename.pict

$ # now look in the extended database built into Python
$ python -m mimetypes --lenient filename.pict
type: image/pict encoding: None

$ # get a file extension by a MIME type
$ python -m mimetypes --extension text/javascript
.js

$ # get a file extension by a rare MIME type
$ python -m mimetypes --extension text/xul
error: unknown type text/xul

$ # now look in the extended database again
$ python -m mimetypes --extension --lenient text/xul
.xul

$ # try to feed an unknown file extension
$ python -m mimetypes filename.sh filename.nc filename.xxx filename.txt
type: application/x-sh encoding: None
type: application/x-netcdf encoding: None
error: unknown extension of filename.xxx

$ # try to feed an unknown MIME type
$ python -m mimetypes --extension audio/aac audio/opus audio/future audio/x-wav
.aac
.opus
error: unknown type audio/future