在块样式 yaml 文件 (ruamel.yaml)

如何解决在块样式 yaml 文件 (ruamel.yaml)

我正在使用 ruamel.yaml 从 Python 字典创建 YAML 文件。在字典中,有一个列表作为 'type' 键的值。我一整天都在寻找解决问题的示例,但在文档中找不到任何内容

我一直在尝试获得这样的 YAML 文件输出

 some_key:
  - id: 1059
    parameter: Paramter1
    unit: kg
    type: [A,B,C,1,2,3]

这意味着 type 之后的列表是块样式中的流样式元素,这就是我切换到 ruamel.yaml 的实际原因,因为我读到它可能与 PyYAML ({{3 }})。但是在那里我找不到我想要做的事情。

当我打电话时我(不出所料)得到了什么

yaml.dump() 

在字典上是

some_key:
  - id: 1059
    parameter: Paramter1
    unit: kg
    type:
          - A 
          - B
          - C
          - '1'
          - '2'
          - '3'

有没有人知道这是如何解决的?有用的信息可能是也可能不是,相关列表也可以转换为不同的格式(例如字符串),我从 csv 表中获取

更新,这是我一直在尝试的代码示例:

CSV 行如下所示:

"","",Parameter 1,Dropdown,kg,"A,3"

在conversion.py中类似:

with open(csv_filename,"r") as file:
reader = csv.reader(file)
data = {"some_key": []}
for position,line in enumerate(reader):
        if line[3] == "Dropdown":
            select_options = []
            for item in line[7].split(","):
                select_options.append(item)
            select_options = [x.strip(" ") for x in select_options]
            type = f"{select_options}"
        dict = {
            "id": "tbd","parameter": line[2].strip(" "),"unit": line[4].strip(" "),"type": type,}
        data["some_key"].append(dict)
doc = yaml.dump(data,file)

解决方法

首先你需要将数字定义为数字,而不是字符串,以获得 那些未引用的输出( 3 而不是 '3'

其次需要调用 yaml.indent() 作为 3 个位置的序列缩进 序列分隔符的偏移量为 1,是非标准的。

然后要精细控制单个列表流样式,您需要将该列表添加为 CommentedSeq 并在其 set_flow_style() 属性上调用 fa 方法:

import sys
import ruamel.yaml

def seq(*l):
    s = ruamel.yaml.comments.CommentedSeq(l)
    s.fa.set_flow_style()
    return s

data = dict(some_key=[{'id': 1059,'parameter': 'Paramter1','unit': 'kg','type': seq('A','B','C',1,2,3)}])


yaml = ruamel.yaml.YAML()
yaml.indent(mapping=2,sequence=3,offset=1)
yaml.dump(data,sys.stdout)

给出:

some_key:
 - id: 1059
   parameter: Paramter1
   unit: kg
   type: [A,B,C,3]

在您的示例中,您可以在之前设置 yaml.default_flow_style = None 转储并使用“正常”列表。但这会影响所有其他“叶节点” 列表和字典也是如此。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?