如何让pyyaml在输出中正确显示结构?

时间:2016-05-31 22:02:52

标签: python pyyaml

而不是正常的换行符,就像我预期的那样只是打印'\ n'。如何让断线实际发生?

#main_nav:before,
#main_nav:after {
  content: "";
  display: table;
}
#main_nav {
  zoom: 1;
  list-style: none;
  float: left;
  margin: 0px 0px 0px 350px;
}
#main_nav li {
  float: left;
  position: relative;
  padding: 0px 5px 0px 5px;
  cursor: pointer;
}
#main_nav li a {
  text-align: center;
}
#main_nav ul {
  list-style: none;
  width: 110px;
  margin: 0px;
  padding: 0px;
  border: solid;
  visibility: hidden;
  position: absolute;
  top: 50px;
  left: 0px;
  z-index: 1;
}
#main_nav li:hover > ul {
  visibility: visible;
  opacity: 1;
  top: -3px;
}
#main_nav > li:hover {
  border-bottom: solid red;
}
#main_nav >li:hover > ul {
  top: 30px;
}
#main_nav ul ul {
  left: 110px;
}

/* To make the first li higher */
#main_nav > li:after {
  content: '';
  position: absolute;
  left: 0;
  display: block;
  width: 100%;
  height: 20px;
}
/* To make the li's inside ul wider */
#main_nav ul > li:after {
  content: '';
  position: absolute;
  top: 0;
  right: -50px;
  display: block;
  width: 50px;
  height: 20px;
}

2 个答案:

答案 0 :(得分:2)

PyYAML中的dump()例程有几个可选参数,第一个是将数据序列化为(stream=)的流。

如果您没有指定此流,则会创建一个类似于对象的文件(StringIO()BytesIO()),数据将被序列化,在这种情况下,dump()例程会返回对象getvalue(),通常只返回None

由于您没有指定输出流,PyYAML不知道在哪里写输出,并在您的情况下将getvalue()的结果作为字符串返回。 如果您提供encoding=参数,您将在Python 3上获得字节数组而不是字符串。

你当然可以print那个字符串,但这是我看到人们使用PyYAML制作的最常见的错误之一。对于小型数据结构,这是可以原谅的,但对于大型数据结构,在内存中创建字符串表示会不必要地消耗大量内存。

你应该习惯提供stream参数:

>>> import yaml
>>> test2 = [{'A':['a', 'b']}, {'B':'b'}]
>>> yaml.dump(test2)
'- A: [a, b]\n- {B: b}\n'
>>> import sys
>>> yaml.dump(test2, stream=sys.stdout)
- A: [a, b]
- {B: b}
>>> 

这也可以防止您在输出结尾处获得双重换行符(一个来自序列化,另一个来自print)。

答案 1 :(得分:1)

您可以使用print获取换行符。以这种方式在交互式提示中显示的字符串永远不会呈现换行符。您可以通过字符串周围显示的引号(')来判断字符串的显示方式,这些字符串不会显示在print中。

>>> test2 = [{'A':['a', 'b']}, {'B':'b'}]
>>> yaml.dump(test2)
'- A: [a, b]\n- {B: b}\n'
>>> print(yaml.dump(test2))
- A: [a, b]
- {B: b}

>>>