2015-10-05 237 views
1

我正在尝试编写一个YAML文件,但它对我来说很新,而且我无法弄清楚嵌套的部分。如何手动编写yaml文件

是否可以像这样写一个文件?

Manager : [email protected] 
    custid : 380 
    employees : 
     - Wright 
     - Thompson 
     - Hope 

Manager: [email protected] 
    custid : 381 
    employees : 
     - Smith 
     - Jones 

每次我写这篇文章,我不断收到错误,

yaml.scanner.ScannerError: mapping values are not allowed here 

这发生在客户ID部分之后。这是为什么发生?

+0

我编辑了您进行异地文件的要求,即超出你允许在这里询问的范围[so]。如果你的谷歌YAML规范,你应该去官方网站,但我必须警告说,规范是不是很容易访问。 – Anthon

回答

0

问题出在Manager :。首先,您使用密钥Manager和标量值[email protected]开始一个映射,然后在下一行继续缩进两个键值对。由于缩进,解析器不知道在哪里附加这些内容。

你可能想要做的:

- Manager : [email protected] 
    custid : 380 
    employees : 
     - Wright 
     - Thompson 
     - Hope 

- Manager: [email protected] 
    custid : 381 
    employees : 
     - Smith 
     - Jones 

即两个经理每个由映射,它有三个键(经理,客户ID,员工)的列表。

您也可以使经理的位置隐含的电子邮件的关键:

[email protected]: 
    custid : 380 
    employees : 
     - Wright 
     - Thompson 
     - Hope 

[email protected]: 
    custid : 381 
    employees : 
     - Smith 
     - Jones 

,但在这种情况下,电子邮件必须是唯一的。

您也可以在顶层使用更复杂的键(所以你可以有相同的电子邮件,只要角色是不同的)¹:

[Manager, [email protected]]: 
    custid : 380 
    employees : 
     - Wright 
     - Thompson 
     - Hope 

[Manager, [email protected]]: 
    custid : 381 
    employees : 
     - Smith 
     - Jones 

但总的原则是,如果你不” t有一些唯一识别每个记录的关键,你需要使用一个列表。


¹这种形式的键是AFAIK不PyYAML支持,但我ruamel.yaml解析器可以处理这些类型的(有效)YAML键

+0

好吧,我明白你的意思了。我想根据选择哪个管理器将这组员工返回到我的Python程序。有没有办法做到这一点? – johnfk3

+0

当然,无论是制作一个管理人员列表,还是通过该列表来选择特定键的值以找到特定管理员,或者重新排列结构并使用例如唯一的电子邮件地址作为密钥,其余作为该密钥的值,或者制作复杂的密钥。我会用替代方案更新我的答案。 – Anthon

+0

谢谢!你所做的“隐藏经理职位和电子邮件钥匙”的部分正是我所期待的 – johnfk3

0

Yaml只能识别空格,所以如果你使用Tab来缩进,也许这就是导致你的问题的原因。 Here是让你入门的官方文档。

+0

我没有使用标签,我使用空格,为什么我不能在“管理器”后面放置一个值,因为如果我删除与“管理器”相关联的电子邮件地址,它就会工作 – johnfk3