所有让yaml在源代码控制环境中可用的烦人的事情。
rtyaml的Python项目详细描述
rtyaml:圆形可折叠纱线
主要作者:joshua taubererhttps://razor.occams.info
此模块是一个包装器,用于读取和写入yaml文件,并进行了一些改进:
- 通过保持密钥的顺序,可以往返yaml文件。在python 3.7+中,只需使用常规的
dict
s。在python的早期版本中,使用collections.orderedict
- 为字符串如何写入yaml设置了更合理的默认值(见下文)。
- 选择其他正常默认值,如使用"安全"装载机/倾卸机。
- 加载yaml时在流的最开始处找到的注释块在写回时保留。
往返旅行是什么意思?
往返(round tripping)是当您加载一个文件,然后将其保存为未更改时,您希望磁盘上的字节不会更改。这在pyyaml中是不可能的,而且很难将yaml文件与git这样的版本控制一起使用,因为每次加载和保存文件时,事情都会重新安排。键可以更改顺序,字符串引用样式可以更改,注释被删除,等等。
尽管rtyaml
不能为所有文件提供往返,但它确实在pyyaml上设置了一些正常的默认值,以便更容易实现。例如,如果使用pyyaml加载此文件:
然后将其保存回原样:
importyamlprint(yaml.dump(yaml.load(open('example.yaml'))))
你弄得一团糟:
注意注释是如何消失的,键zz
,yy
,xx
更改了顺序,字符串的格式不一致,空值使用了一个混乱的关键字,映射被压缩成一行。
使用ryaml
,您实际上得到了原始文件!这基本上就是这个图书馆的重点。
安装和使用
安装:
pip install rtyaml
(or pip3 --- this module works in both Python 2 and Python 3)
用法:
import rtyaml
with open("myfile.yaml") as f:
stuff = rtyaml.load(f)
# ...do things to stuf...
with open("myfile.yaml", "w") as f:
rtyaml.dump(stuff, f)
与底层pyyaml库一样,load
接受包含yaml或打开文件对象(二进制或文本)的字符串或字节字符串。另外,dump的第二个参数是可选的,如果省略,函数将返回字符串中的yaml。
全部加载
和全部转储
也受支持,它们使用yaml的--
文档分隔符加载和保存文档列表。
依赖关系
- pyyaml(在ubuntu中,
python yaml
或python3yaml
包) - libyaml(在ubuntu中,
libyaml-0-2
package plus,仅在安装时,libyaml dev
)
详细信息
此库执行以下操作:
- 使用本地libyaml csafeloader和cdumper进行速度和可信操作。
- 在
dicts
中保留键的顺序,而不是调整键的大小(python>;=3.7)。 - 允许您使用
collections.ordereddict
s和dump
来保留键顺序(在python 3.7之前很有用)。 - 在块模式下写入多行字符串(而不是用难看的转义换行符引用),根据字符串中行的长度选择文字模式还是折叠模式。
- 以扩展的(每行一个)格式写入映射和列表,这在版本控制中输出时很好。
- 修改流字符串引用规则使任何由数字组成的字符串都用引号序列化。(默认设置序列化带引号的字符串"01",但字符串"09"不带引号!(你能找出原因吗?)
none
被序列化为颚化符,而不是null
,这样就不那么容易混淆了。- 如果块注释出现在文件的开头(即一行或多行以"35;"开头),则如果用rtyaml.dump()写入同一对象,则将其写回。
对于Python3.6及更早版本:
- 加载映射
collections.orderedict
以便在以后使用转储文件时密钥顺序保持不变。(这在Python3.7中已不再需要,因为键顺序现在以常规方式保存。
对于python 2.x及更早版本:
- 编写没有任何奇怪yaml标记的unicode字符串。它们只是串起来的。输出是utf-8编码的,非ascii字符显示为unicode而不转义。
具有用于编辑文件的块助手
rtyaml.edit
类是一个实用程序类,可以与块一起使用,这样可以更容易地就地编辑yaml文件。例如:
with rtyaml.edit("path/to/data.yaml", default={}) as data:
data\["hello"\] = "world"
打开文件进行编辑("r+"模式,或"w+"模式,如果它不存在,并给出默认值),其内容将被解析并作为带有块变量的数据返回。执行WITH块时,文件保持打开状态。当WITH块退出时,WITH块变量作为yaml写回文件,然后关闭文件。
当然,只有当文件包含一个数组或对象(dict)时,这才起作用,并且不能为with block变量赋值(这就是python with block s的工作原理)。您只能调用其方法,即您可以编辑列表(append、pop、sort等)和dict(get/set keys),但不能用全新的列表或dict替换该值。
如果未给定默认参数或参数为"无",则文件必须存在。否则,如果文件不存在,则会创建该文件,并使用WITH BLOCK变量以默认值启动。
如果要自己打开文件,也可以将流作为第一个参数传递。流必须支持seek、truncate和close。如果打开文件,应使用"R+"或"W+"模式。
公共领域奉献
此项目专用于公共域,如许可证文件所示:
< Buff行情>该项目在美国境内属于公共领域,通过CC01.0通用公共领域奉献,放弃了世界范围内作品的版权和相关权利。http://creativecommons.org/publicdomain/zero/1.0/
所有对这个项目的贡献都必须在cc0奉献下发布。提交请求即表示您同意遵守此版权权益豁免。