Python YAML转储单引号和双引号问题



我正在从excel文件中读取行,并将其转储到YAML文件中,转储后,我发现一些行以单引号、双引号和纯文本形式提及。

没有任何特殊字符的数据将创建为纯文本
带字符和括号的数据被创建为"此处数据">

我正在使用yaml dumper创建yaml文件

with open(myprops['output'], "w") as f:
ruamel.yaml.dump(doc,f, Dumper=ruamel.yaml.RoundTripDumper,default_flow_style=False)

如何表示单引号- 'Data here'中的所有数据?

当标量可以表示时,可以强制dumper使用单引号通过提供CCD_ 2参数来使用单引号字符串。

但这并不能保证给你带来单引号,单引号是做不到的双引号的转义序列(即它不像Python(和有些值可能仍然会有双引号。

使用ruamel.yaml的新API(其中round-trip-dumping是默认设置(:

import sys
import ruamel.yaml
data = [
"25",
"with ann embedded newline",
"entry with single quote: (')",
42
]
yaml = ruamel.yaml.YAML()
yaml.default_style = "'"
yaml.dump(data, sys.stdout)

它给出:

- '25'
- "with ann embedded newline"
- 'entry with single quote: ('')'
- !!int '42'

请注意,为了将42识别为整数,因为引号,该标量需要标记。同样适用于YAML可以表示的其他特殊类型(浮点、布尔值等(如果不要确保所有转储的值都是字符串。

您还可以看到YAML中的一个转义机制单引号标量:因为标量中的单引号被加倍。(如果是在Python字符串,在标量末尾的一行中有三个单引号。

如果你想在引用中保持一致,你应该使用双引号,因为它可以代表所有有效字符。YAML中的单引号标量可以跨越多行,因此原则上可以嵌入换行符。但是换行符周围的空格是有限制的。

如果您的输入数据中混合了字符串和非字符串值,并且不想让非字符串被引用,那么您必须在数据结构上递归,并将每个字符串x替换为ruamel.yaml.scalarstring.SingleQuotedScalarString(x),即如果指定yaml.preserve_quotes = True来区分单引号输入和纯/双引号/文本/折叠标量,则ruamel.yaml使用的内部表示。

最新更新