tomli
Lil'Toml Parser
用mdformat-toc生成的目录
-
安装
-
用法
-
常问问题
-
为什么要解析?
-
是否支持保存往返解析的评论?
-
是否有
dumps,write或encode功能? -
TOML类型如何映射到Python类型中?
-
表现
-
纯Python
-
mypyc生成的轮子
简介
tomli是一个解析Toml的Python图书馆。它与TOML V1.0.0完全兼容。
tomli的版本tomllib模块通过PEP 680添加到Python 3.11 tomli标准库中。Tomli继续为Python版本的PYTHON提供了一个Backport,其中尚未提供标准库模块,并且尚未达到其寿命终止。
tomli使用MyPyC为大多数广泛使用的平台生成二进制轮毂,因此Python 3.11+用户可能更喜欢它,而不是tomllib ,以提高性能。纯Python车轮在任何平台上都可以使用,应与tomllib相同。
安装
pip install tomli
用法
解析汤绳
import tomlitoml_str = """[[players]]name = "Lehtinen"number = 26[[players]]name = "Numminen"number = 27"""toml_dict = tomli . loads ( toml_str )assert toml_dict == {"players" : [{ "name" : "Lehtinen" , "number" : 26 }, { "name" : "Numminen" , "number" : 27 }]
}
解析toml文件
import tomliwith open ( "path_to_file/conf.toml" , "rb" ) as f :toml_dict = tomli . load ( f )
该文件必须以二进制模式打开(带有"rb"标志)。二进制模式将强制执行将文件解码为UTF-8,并且禁用了通用新线,这两者都是正确解析TOML所必需的。
处理无效的TOML
import tomlitry :toml_dict = tomli . loads ( "]] this is invalid TOML [[" )except tomli . TOMLDecodeError :print ( "Yep, definitely not valid." )
请注意,错误消息仅视为信息。不应假定它们在tomli版本中保持不变。
构造decimal.Decimal
from decimal import Decimalimport tomlitoml_dict = tomli . loads ( "precision-matters = 0.982492" , parse_float = Decimal )assert isinstance ( toml_dict [ "precision-matters" ], Decimal )assert toml_dict [ "precision-matters" ] == Decimal ( "0.982492" )
请注意, decimal.Decimal可以用另一个可call脚替换,该可召唤将TOML Float从字符串转换为Python类型。然而, decimal.Decimal是无法忍受浮动不准确的用例,这是一个实用的选择。
非法类型是dict and list及其亚型。如果parse_float产生非法类型,则将提高ValueError 。
构建tomli / tomllib兼容层
Python版本3.11+带有tomli版本的船: tomllib标准库模块。要构建使用标准库(如果有)但仍然与Python 3.6+无缝工作的代码,请执行以下操作。
而不是硬tomli依赖性,而是使用以下依赖规范符在不可用的标准库模块时才需要tomli :
tomli >= 1.1.0 ; python_version < "3.11"
然后,在您的代码中,使用以下后备机制导入TOML解析器:
import sysif sys . version_info >= ( 3 , 11 ):import tomllibelse :import tomli as tomllibtomllib . loads ( "['This parses fine with Python 3.6+']" )
常问问题
为什么要解析?
-
是小'
-
纯python具有零依赖性
-
最快的纯Python Parser *:18倍与Tomlkit一样快,2.1倍,toml
-
仅输出基本数据类型
-
100%规格:通过Burntsushi/Toml-Test测试套件通过所有测试
-
经过彻底测试:100%分支机构覆盖
是否支持保存往返解析的评论?
不。
tomli .loads函数返回一个平原dict ,该命令仅来自标准库中的内置类型和类型。保留评论需要返回自定义类型,因此不会支持tomli .loads和tomli .load函数。
如果您需要保存风格,请查看Toml套件。
是否有dumps , write或encode功能?
tomli -W是tomli的仅写作,提供dump和dumps功能。
核心库不包括写入功能,因为大多数TOML用例都是只读的,而tomli打算最小。
TOML类型如何映射到Python类型中?
| TOML类型 | Python类型 | 细节 |
|---|---|---|
| 文档根 | dict |
|
| 钥匙 | str |
|
| 细绳 | str |
|
| 整数 | int |
|
| 漂浮 | float |
|
| 布尔 | bool |
|
| 偏移日期时间 | datetime.datetime |
tzinfo属性设置为datetime.timezone的实例 |
| 本地日期时间 | datetime.datetime |
tzinfo属性设置为None |
| 本地日期 | datetime.date |
|
| 当地时间 | datetime.time |
|
| 大批 | list |
|
| 桌子 | dict |
|
| 内联表 | dict |
表现
该存储库中的benchmark/文件夹包含一个性能基准,用于比较各种Python Toml Parsers。
以下是提交0724E2A的结果。
纯Python
foo@bar:~/dev/ tomli $ python --versionPython 3.12.7foo@bar:~/dev/ tomli $ pip freezeattrs==21.4.0click==8.1.7pytomlpp==1.0.13qtoml==0.3.1rtoml==0.11.0toml==0.10.2tomli @ file:///home/foo/dev/ tomlitomlkit==0.13.2foo@bar:~/dev/ tomli $ python benchmark/run.pyParsing data.toml 5000 times:------------------------------------------------------ parser | exec time | performance (more is better)-----------+------------+----------------------------- rtoml | 0.647 s | baseline (100%) pytomlpp | 0.891 s | 72.62% tomli | 3.14 s | 20.56% toml | 6.69 s | 9.67% qtoml | 8.27 s | 7.82% tomlkit | 56.1 s | 1.15%
mypyc生成的轮子
foo@bar:~/dev/ tomli $ python benchmark/run.pyParsing data.toml 5000 times:------------------------------------------------------ parser | exec time | performance (more is better)-----------+------------+----------------------------- rtoml | 0.668 s | baseline (100%) pytomlpp | 0.893 s | 74.81% tomli | 1.96 s | 34.18% toml | 6.64 s | 10.07% qtoml | 8.26 s | 8.09% tomlkit | 52.9 s | 1.26%
