【问题标题】:Python YAML dumper single quote and double quote issuePython YAML dumper 单引号和双引号问题
【发布时间】:2019-05-05 11:38:13
【问题描述】:

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

没有任何特殊字符的数据被创建为纯文本。
带有 \n 字符和括号的数据被创建为“此处的数据”
带有特殊字符的数据被创建为“这里的数据”

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

【问题讨论】:

  • 如果你想知道为什么你想要所有单引号会很有趣,这是为了美学吗?无论引用如何,正确的 YAML 解析器都会处理输出。
  • 我需要的值应该是单引号,这就是第三方框架接受 yaml 文件的方式。

标签: python yaml pyyaml ruamel.yaml


【解决方案1】:

当标量可以表示时,您可以强制转储程序使用单引号 通过提供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),即 ruamel.yaml 使用的内部表示,如果您指定 yaml.preserve_quotes = True 来区分单引号输入和普通/双/字面/折叠标量。

【讨论】:

  • 感谢您的建议。它有助于理解 yaml,yaml.default_style = "'" 有问题,它还会在单引号中打印键和值。示例'名称':'NameHere''数据类型':'VARCHAR''comment':'CommentHere'
  • 是的,所有内容都是单引号。因此,您将不得不按照我的回答中的建议将所有值更改为 SingleQuotedScalarStrings
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
相关资源
最近更新 更多