簡體   English   中英

編輯 yaml 文件中的特定數據,而不編輯 Python 中的整個 yaml 文件

[英]Edit specific data in yaml file without editing the whole yaml file in Python

我有以下 YAML 文件:

yaml:
  type: bus
  format-version: 1.0.0
main:
  sub:

    test_data1:
      version: 0.0.20
      url:
        repo: artifactory_1

    test_data2:
      version: 0.1.8
      url:
        repo: artifactory_2

每當我嘗試更改“test_data1-version”時,我都會執行以下操作:

import ruamel.yaml
import yaml

def read_yaml(file_path: str) -> Dict[str, Any]:
with open(file_path) as file1:
    yaml_data = yaml.full_load(file1)
    return yaml_data

def write_yaml(file_path: str, data: Dict[str, Any]):
with open(file_path, 'w') as file3:
    yaml = ruamel.yaml.YAML()
    yaml.indent(sequence=4, offset=2)
    yaml.default_flow_style= False
    yaml.dump(data, file3)

我閱讀了 yaml 文件,將版本號從“0.0.20”更改為“1.0.0”,並使用寫入 function 將編輯后的數據寫回 Z6EEDC03A68A69933C2FZE674F23 文件。 當我這樣做時,我最終得到了一個格式完全不同的 yaml 文件(下圖缺少空格)。

yaml:
  type: bus
  format-version: 1.0.0
main:
  sub:
    test_data1:
      version: 1.0.0
      url:
        repo: artifactory_1
    test_data2:
      version: 0.1.8
      url:
        repo: artifactory_2

任何對如何不編輯整個文件的格式有任何想法的人,而只是編輯所需的特定數據。

這是一個執行 whitepsaces 的簡單腳本。

file_1 = open('wrong_formated.yaml', 'r')
Lines = file_1.readlines()
file_2 = open('new_yaml.yaml', 'w')

indent_for_element_with_new_lines = 4

for line in Lines:
    print(line)
    if line.startswith(' ' * indent_for_element_with_new_lines) and line[5] != ' ':
        file_2.writelines('\n')
    file_2.writelines(line)

但它要求之前所有帶有空格的元素都具有相同的縮進。 並且沒有其他元素具有該縮進。

我不清楚你為什么使用過時的 PyYAML 來加載數據。 如果您也為此使用ruamel.yaml ,您可以毫無問題地往返輸入。

import sys
import ruamel.yaml
from pathlib import Path

in_file = Path('input.yaml')


yaml = ruamel.yaml.YAML()
yaml.indent(mapping=2, sequence=4, offset=2)
data = yaml.load(in_file)
yaml.dump(data, sys.stdout)

這使:

yaml:
  type: bus
  format-version: 1.0.0
main:
  sub:

    test_data1:
      version: 0.0.20
      url:
        repo: artifactory_1

    test_data2:
      version: 0.1.8
      url:
        repo: artifactory_2

您不必使用yaml.default_flow_style除非您添加其他字典或列表,因為它不會影響使用ruamel.yaml加載的映射/序列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM