Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Pyyaml或Ruamel.yaml在Python中编辑.yaml文件_Python_Yaml_Edit - Fatal编程技术网

使用Pyyaml或Ruamel.yaml在Python中编辑.yaml文件

使用Pyyaml或Ruamel.yaml在Python中编辑.yaml文件,python,yaml,edit,Python,Yaml,Edit,我有一个.yaml文件,其结构如下: %YAML:1.0 #-------------------------------------------------------------------------------------------- # Camera Parameters. Adjust them! #--------------------------------------------------------------------------------------------

我有一个.yaml文件,其结构如下:

%YAML:1.0
#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------

#Camera calibration and distortion parameters (OpenCV)

Camera.fx: 707.0912
Camera.fy: 707.0912
Camera.cx: 601.8873
Camera.cy: 183.1104
到目前为止,我一直在使用PyYaml库打开文件,并使用以下代码片段将每个参数和值保存到代码中的数组中:

def configFileManipulator():
    path = filedir+"KITTI04-12.yaml"
    data = yaml_loader(path)
    config = data.items()

    #print(data)
    for item, value in config:
        parameter_list.append(item)
        parameter_values.append(value)

def yaml_loader(filepath):
    """Loads a yaml file """
    with open(filepath, "r") as file:
        _ = file.readline()
        doc = yaml.load(file, Loader=yaml.FullLoader)
    return doc
前面的代码段跳过了第一行,因为程序由于文件的第一行而崩溃:
%Yaml:1.0

当我试图编辑读取的其中一行以更改值,然后将其保存回配置文件时,就会出现问题。我尝试了pyyaml和ruamel.yaml两个例子,但它们要么改变了文件的整个方面(删除注释,我特别不介意,要么根本不改变值)

我还发现,当我尝试转储新更改的值时,
%yaml:1.0
没有传递到已编辑的文件,这会导致使用该文件的软件崩溃。是否有一种方法可以编辑YAML文件中的值,以便对其进行更改,但不会影响结构(标题和可能的注释)


如果没有,我如何编辑YAML文件,使其保持原样,但具有更改的值?

您必须更新/更改YAML\u loader返回的数据结构,然后 重新添加YAML 1.0标题:

import ruamel.yaml
import sys

filedir = ""

def yaml_loader(file_path):
    yaml = ruamel.yaml.YAML()
    with open(file_path, 'rb') as fp:
        _ = fp.readline()
        return yaml.load(fp)

def yaml_dumper(data, file_path=None):
    def yaml_to_stream(data, s):
        yaml = ruamel.yaml.YAML()
        s.write('%YAML:1.0\n')
        yaml.dump(data, s)

    if file_path is None:
        yaml_to_stream(data, sys.stdout)
    else:
        with open(file_path, 'wb') as fp:
            yaml_to_stream(data, fp)


def config_file_manipulator():
    path = filedir+"KITTI04-12.yaml"
    data = yaml_loader(path)
    config = data.items()

    data['Camera.cx'] = 192.54     # update a value
    del data['Camera.cy']          # delete a value
    data['Camera.cz'] = 42.42      # add a value

    yaml_dumper(data) # or yaml_dumper(data, path) to rewrite the file

config_file_manipulator()
其中:

%YAML:1.0
#--------------------------------------------------------------------------------------------
# Camera Parameters. Adjust them!
#--------------------------------------------------------------------------------------------

#Camera calibration and distortion parameters (OpenCV)

Camera.fx: 707.0912
Camera.fy: 707.0912
Camera.cx: 192.54
Camera.cz: 42.42

最后的yaml是否被另一个程序使用?小注-为了避免使用嵌套函数编写
yaml\u转储程序
,我们可以使用;如果file_path(file_path,'wb')作为fp或类似文件(文档中几乎就是以这个用例为例)没有打开,那么我们就可以将
与nullcontext(sys.stdout)一起使用。@sabik不知道这一点,这表明您必须阅读每一个新的python次要版本的所有手册,我想这就是堆栈溢出的原因:-)