Python YAML dumper 单引号和双引号问题

Python YAML dumper single quote and double quote issue

我正在读取 excel 文件中的行并转储到 YAML 文件,转储后我发现有些行在单引号、双引号和纯文本中提到。

没有任何特殊字符的数据被创建为纯文本。
带有 \n 字符和括号的数据被创建为 'Data here'
具有特殊字符的数据被创建为 "Data here"

我正在使用 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'

当可以表示标量时,您可以强制转储程序使用单引号 通过提供 default_style="'" 参数使用单引号字符串。

虽然这不能保证让你得到单引号,但单引号做不到 双引号的转义序列(即它不像 Python)和 某些值可能仍会用双引号引起来。

使用 ruamel.yaml 的新 API(默认为往返转储):

import sys
import ruamel.yaml

data = [
   "25",
   "with an\n embedded newline",
   "entry with single quote: (')",
   42
]

yaml = ruamel.yaml.YAML()
yaml.default_style = "'"
yaml.dump(data, sys.stdout)

给出:

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

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

您还可以看到 YAML 中单引号标量的一种转义机制: 因为标量中的单引号加倍。 (如果它是在结束时 Python 字符串,您将在标量末尾连续使用三个单引号。

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

如果您的输入数据中混合了字符串和非字符串值,并且您不想引用非字符串,那么您必须递归数据结构并替换每个字符串 xruamel.yaml.scalarstring.SingleQuotedScalarString(x), 即 如果您指定 yaml.preserve_quotes = True 以区分单引号输入和 plain/double/literal/folded 标量,ruamel.yaml 使用的内部表示。