在 yaml.dump Python 中强制引用

2024-01-07

在我进入之前,是的,我已经研究过它并且知道 YAML 不区分引号和非引号,而只是按原样获取类型。坦率地说,我认为没有引号更好,但不幸的是这不是我需要的。所以请尝试理解我have研究了这个问题,但仍然需要我的字符串对象周围的引号。

在我的代码中我有一本字典:

data = {dic:[{A:''}, {B:''}, {C:''}, {D:''},...]}

the 'var*'通过 PyQt4 构建QLineEdit代码行提取的类看起来像这样:

var* = str(QtGui.QLineEdit().displayText())

所以当我这样做时data['dic'][index]['A'-'Z'] = var*

它成为了data = {dic:[{A: 'var1'}, {B:'var2'}, {C:'var3'}, {D:'var4'},...]}

然后我转储所有数据:

prettyData = yaml.dump(data, default_flow_style=False, width=10000000)

and print prettyData我明白了:

dic:
  - A: var1
  - B: var2
  - C: var3
  - D: var4
  ...

我尝试了很多方法来让它们出现:

dic:
  - A: 'var1'
  - B: 'var2'
  - C: 'var3'
  - D: 'var4'
  ...

但还没有成功。我听到了关于这个问题的不同意见,从“不可能”到“只需在它们周围加上引号”,正如你所看到的,就我而言,我不能这样做。

关于如何解决这个问题有什么想法吗?


您可以覆盖标量的发射器并更改动态发射的值的样式。根据您拥有的其余标量值,您可能需要进行更多测试才能取消设置is_string。到......的时候process_scalar被称为您不再知道原始值,您只有一个带有(unicode)字符串值的事件。

import sys
import ruamel.yaml as yaml

yaml_str = """\
dic:
  - A: var1    # need to get these strings quoted
  - B: var2
  - C: var3
  - D: var4
  - E: 3       # leave this alone
"""

# the scalar emitter from emitter.py
def process_scalar(self):
    if self.analysis is None:
        self.analysis = self.analyze_scalar(self.event.value)
    if self.style is None:
        self.style = self.choose_scalar_style()
    split = (not self.simple_key_context)
    # VVVVVVVVVVVVVVVVVVVV added
    if split:  # not a key
        is_string = True
        if self.event.value and self.event.value[0].isdigit():
            is_string = False
        # insert extra tests for scalars that should not be ?
        if is_string:
            self.style = "'"
    # ^^^^^^^^^^^^^^^^^^^^
    # if self.analysis.multiline and split    \
    #         and (not self.style or self.style in '\'\"'):
    #     self.write_indent()
    if self.style == '"':
        self.write_double_quoted(self.analysis.scalar, split)
    elif self.style == '\'':
        self.write_single_quoted(self.analysis.scalar, split)
    elif self.style == '>':
        self.write_folded(self.analysis.scalar)
    elif self.style == '|':
        self.write_literal(self.analysis.scalar)
    else:
        self.write_plain(self.analysis.scalar, split)
    self.analysis = None
    self.style = None
    if self.event.comment:
        self.write_post_comment(self.event)

data = yaml.load(yaml_str, Loader=yaml.RoundTripLoader)
dd = yaml.RoundTripDumper
dd.process_scalar = process_scalar
yaml.dump(data, sys.stdout, Dumper=dd)

并得到输出:

dic:
- A: 'var1'    # need to get these strings quoted
- B: 'var2'
- C: 'var3'
- D: 'var4'
- E: 3         # leave this alone

¹ This was done using ruamel.yaml https://pypi.python.org/pypi/ruamel.yaml of which I am the author. That package is an enhancement of PyYAML. You might be able to do something similar with the latter, but it would drop the comments that are in the input.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 yaml.dump Python 中强制引用 的相关文章

随机推荐

  • 从打开的文件中获取文件名,而不是文件路径

    假设我使用文件对话框在 PyQt5 应用程序中打开了一个名为 file1 mp3 的文件 并将其分配给如下变量 song QFileDialog getOpenFileName self Open Song Sound Files mp3
  • 从命令行设置 Url 段最大长度

    有没有办法设置UrlSegmentMaxLength价值Http sys使用 appcmd netsh 或任何其他命令行实用程序 我意识到这是一个老问题 但万一有人偶然发现这个问题 这里有一个 PowerShell 单行代码 它可以创建密钥
  • std::wstring 在 Windows 上支持 UTF-16 和 UTF-32 吗?

    我正在学习 Unicode 并有几个问题希望得到解答 1 我在 Linux 上读到过 std wstring是 4 字节 而在 Windows 上是 2 字节 这是否意味着 Linux 内部支持UTF 32而Windows则是UTF 16
  • 使用 Notepad++、Regex 重构 CSV 数据

    我有一个 CSV 文件 其中包含以下标题和 示例 数据 StopName RouteName Travel Direction Latitude Longitude StreetA StreetB 1 NameA DirectionA La
  • Tensorflow Precision、Recall、F1 - 多标签分类

    我正在尝试使用张量流实现多标签句子分类模型 大约有 1500 个标签 该模型运行得很好 但我不确定它生成的指标 这是生成指标的代码段 with tf name scope loss losses tf nn softmax cross en
  • 带有第三方库的 Typescript 3 项目参考(来自 npm)

    我正在使用 Typescript 并尝试与服务工作者建立后台同步 有人建议我应该这样做this https stackoverflow com a 52377959 6683308 您可以使用单独的 tsconfig json 文件将项目拆
  • Eclipse 未运行 JavaFX 应用程序 - 运行“java”应用程序

    每当我在 Eclipse 中创建项目并包含 javafx 时 当我单击运行按钮时 应用程序不会加载 e g package test import javafx application Application import javafx e
  • 如何获取网站的 Bing 搜索 Api 和 AppID [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我已经创建了我想要使用的网站必应搜索 API 为此它需要AppID但我没有得到AppID 我尝试通过创建在 天蓝色市场 上创建一个AppId窗口实时I
  • 如何在 spring 4.* 中通过注解创建多个字段的约束验证器

    以 spring 4 为例 如何通过注解为更多字段创建验证器限制 UniqueValidator Entity Table name persons UniqueValidator message Peson already exist c
  • 根据语言更改字体大小

    所以我读了一些关于 css 语言标签的建议 但似乎一切都需要提前将语言放入标签中 我无法更改韩语语言的 html 标签 它与英语具有相同的 h1 标签 这是因为它是同一网站的翻译版本 我希望韩语版本的字体和字体大小与英语版本不同 我可以仅通
  • Javafx ListView 使用图像而不是字符串

    我正在尝试在我的程序中制作带有电影图片的横幅 但我无法将带有图像网址的列表转换为实际图像 我该如何做到这一点 这是我当前的代码 public void initData boolean onlineProvider String urite
  • 用于将执行 xml 计划可视化为 HTML 的工具

    是否有任何工具 XSLT 样式表可将 Microsoft Visual Studio 返回的 XML 执行计划转换为 HTML 如果做不到这一点 有谁知道有什么技术可以用来显示适合显示执行计划的 HTML 图表 我找不到所以我自己做了一个
  • “URL 安全的 CSRF 令牌现在是默认的”警告

    我最近从 Rails 6 升级到 7 尽管我已经urlsafe csrf tokens设置为真 config initializers new framework defaults 6 1 rb Rails application conf
  • 如何使用 AsyncTask 类更新将文件复制到另一个目录的进度?

    我应该如何使用 AsyncTask 类和进度条来执行将文件复制到手机 SD 卡本地上下文中的另一个目录的过程 我在 这里 1 看到了一个类似的例子 但我不知道如何合并差异 修改代码的上下文以适应我的上下文以使其工作 会是这样的 Params
  • 国际化 HelloWorld 程序 .NET

    我有一个小型测试应用程序 它有 2 个资源文件 Resources resx Resources de DE resx 具有完全相同的字符串名称 但将字符串转换为德语 对于我的表单 我将 Localize 属性设置为 true 在我的应用程
  • Postgresql 转储权限被拒绝

    我在尝试转储数据库时收到此错误 我输入 linuxuser sudo su postgres linuxuser sudo password for linuxuser pg dump h localhost mydb gt tempfil
  • 枚举不应该在 API 中使用吗?

    我正在使用提供给我的已编译的 C 库 我对编译库时使用的编译器 版本 选项等的信息有限 库接口使用enum既可以在传递的结构中 也可以直接作为传递的参数 问题是 如何确保或确定当我编译代码以使用提供的库时 我的编译器将为这些库使用相同的大小
  • 如何将 Gradle 中的原生 JUnit 5 支持与 Kotlin DSL 结合使用?

    我想将内置 JUnit 5 与 Gradle Kotlin DSL 一起使用 因为在构建过程中我收到此警告 WARNING The junit platform gradle plugin is deprecated and will be
  • 所有构建的 gcloud 步骤超时的全局限制在哪里设置?

    在哪里可以找到 gcloud 构建步骤超时的全局限制 这是我的 gcloud 构建配置 steps name gcr io cloud builders yarn name gcr io cloud builders yarn args b
  • 在 yaml.dump Python 中强制引用

    在我进入之前 是的 我已经研究过它并且知道 YAML 不区分引号和非引号 而只是按原样获取类型 坦率地说 我认为没有引号更好 但不幸的是这不是我需要的 所以请尝试理解我have研究了这个问题 但仍然需要我的字符串对象周围的引号 在我的代码中