所有让yaml在源代码控制环境中可用的烦人的事情。

rtyaml的Python项目详细描述


rtyaml:圆形可折叠纱线

主要作者:joshua taubererhttps://razor.occams.info

此模块是一个包装器,用于读取和写入yaml文件,并进行了一些改进:

  • 通过保持密钥的顺序,可以往返yaml文件。在python 3.7+中,只需使用常规的dicts。在python的早期版本中,使用collections.orderedict
  • 为字符串如何写入yaml设置了更合理的默认值(见下文)。
  • 选择其他正常默认值,如使用"安全"装载机/倾卸机。
  • 加载yaml时在流的最开始处找到的注释块在写回时保留。

往返旅行是什么意思?

往返(round tripping)是当您加载一个文件,然后将其保存为未更改时,您希望磁盘上的字节不会更改。这在pyyaml中是不可能的,而且很难将yaml文件与git这样的版本控制一起使用,因为每次加载和保存文件时,事情都会重新安排。键可以更改顺序,字符串引用样式可以更改,注释被删除,等等。

尽管rtyaml不能为所有文件提供往返,但它确实在pyyaml上设置了一些正常的默认值,以便更容易实现。例如,如果使用pyyaml加载此文件:

 src=

然后将其保存回原样:

importyamlprint(yaml.dump(yaml.load(open('example.yaml'))))

你弄得一团糟:

 src=

注意注释是如何消失的,键zzyyxx更改了顺序,字符串的格式不一致,空值使用了一个混乱的关键字,映射被压缩成一行。

使用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 yamlpython3yaml包)
  • libyaml(在ubuntu中,libyaml-0-2package plus,仅在安装时,libyaml dev

详细信息

此库执行以下操作:

  • 使用本地libyaml csafeloader和cdumper进行速度和可信操作。
  • dicts中保留键的顺序,而不是调整键的大小(python>;=3.7)。
  • 允许您使用collections.ordereddicts和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奉献下发布。提交请求即表示您同意遵守此版权权益豁免。

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

推荐PyPI第三方库


热门话题
AmazonS3查找从S3forJava下载的压缩文件的MIME类型   java如何使用Selenium在<span>中查找具有特定文本的元素   python如何使用OpenIEDemo生成自定义三元组。由stanfordnlp提供的java   java遇到“方法不适用”编译错误   java如何使用Mockito在Looper中运行的验证代码。getMainLooper?   类Java目录错误   java在已知其他泛型信息时使用原始类型   java connect()和disconnect()在哪里实现?   java使用PDF Box库拆分PDF,生成的PDF几乎与源PDF文件大小相同   java PowerMockito返回错误的对象   java如何找到TIBCO集合消息的字节编码?   java Basic音乐播放器下一步和上一步按钮   添加模块描述符时,java没有名为“entityManagerFactory”的bean可用   java为什么我的代码不是线程安全的?   eclipse java。引用项目中的类的lang.NoClassDefFoundError