使用Pyyaml或Ruamel.yaml在Python中编辑.yaml文件
我有一个.yaml文件,其结构如下:使用Pyyaml或Ruamel.yaml在Python中编辑.yaml文件,python,yaml,edit,Python,Yaml,Edit,我有一个.yaml文件,其结构如下: %YAML:1.0 #-------------------------------------------------------------------------------------------- # Camera Parameters. Adjust them! #--------------------------------------------------------------------------------------------
%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次要版本的所有手册,我想这就是堆栈溢出的原因:-)