我正在使用 golang yaml v3 库。目标是从带有注释的文件中解析任何 yaml(这意味着我没有预定义的结构),能够设置或取消设置结果树中的任何值并将其写回文件。
然而,我遇到了相当奇怪的行为。正如您在下面的代码中看到的,如果传递给 Unmarshal 函数的主要类型是interface{}
,则不会保留任何注释,并且库使用映射和切片来表示 yaml 的结构。另一方面,如果我使用(在本例中)[]yaml.Node
结构,它确实在内部将所有节点表示为yaml.Node
or []yaml.Node
。这或多或少是我想要的,因为它允许保留评论。然而,它不是一个通用的解决方案,因为至少有两种不同的场景 - YAML 以数组开头或以映射开头,我不确定如何优雅地处理这两种情况。
您能否为我指出正确的方向并详细说明为什么图书馆会这样做?
package main
import (
"fmt"
"reflect"
"gopkg.in/yaml.v3"
)
type Document interface{} // change this to []yaml.Node and it will work with comments // change it to yaml.Node and it will not work
var data string = ` # Employee records
- martin:
name: Martin D'vloper
job: Developer
skills:
- python
- perl
- pascal
- tabitha:
name: …
Run Code Online (Sandbox Code Playgroud) pythonyaml
包(版本 5.1.2)能够正确加载以下文件,即使该列表不是用前导编写的-
xx: [x1, x2]
yy: [y1, y2, y3]
Run Code Online (Sandbox Code Playgroud)
加载代码如下
import yaml
with open('some file') as f:
data = yaml.load(f, Loader=yaml.FullLoader)
Run Code Online (Sandbox Code Playgroud)
此格式用于 github actions 配置 yaml 文件。例如,
on: [push, pull_request]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [2.7, 3.5, 3.6, 3.7, 3.8]
os: [ubuntu-16.04, ubuntu-18.04]
node: [6, 8, 10]
Run Code Online (Sandbox Code Playgroud)
但是当我data
使用 写入文件时yaml.dump(data, f)
,它采用-
约定,即
xx:
- x1
- x2
yy:
- y1
- y2
- y3
Run Code Online (Sandbox Code Playgroud)
有没有办法强制它变成类似 github-actions 的格式?
有人告诉我default_flow_style
,但它并没有给出我想要的。
yaml.dump({"A":[1,2,3],"B":[4,5,6]},default_flow_style=True) …
Run Code Online (Sandbox Code Playgroud) 我正在使用python 3.9.5
, 和PyYaml 5.4.1
.
t.yml
我有一个包含以下内容的文件。
- \xe2\xac\x86\xef\xb8\x8f\n
Run Code Online (Sandbox Code Playgroud)\n我编写了一个简单的 python 代码,用于读取 yaml 文件并将其转储回来。
\nimport yaml\n\nwith open("t.yml") as file:\n con = yaml.safe_load(file)\n print(con)\n with open("t.yml","w") as file:\n yaml.dump(con,file)\n
Run Code Online (Sandbox Code Playgroud)\n代码的输出是:
\n[\'\xe2\xac\x86\xef\xb8\x8f\']\n
Run Code Online (Sandbox Code Playgroud)\n转储yaml后,t.yml
文件变成这样:
- "\\u2B06\\uFE0F\\U0001F622"\n
Run Code Online (Sandbox Code Playgroud)\n如何以与我加载的完全相同的格式转储表情符号?
\n