[英]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.