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