錯誤一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117)
出現這個問題一直沒找到原因,后面把yaml.safe_dump直接替換成yaml.dump,確實能保存,但出現亂碼:
放棄yaml.dump,又切回yaml.safe_dump。后面發現它只支持基本的數據類型,對于自定義對象或某些復雜對象(如 NumPy 數組、自定義類實例等),不知道如何序列化。
檢查序列,確實存在數組:
改成int或list即可,具體可以參考下面的代碼:
# 對象定義自定義的表示器(representer),序列化自定義對象####################
# numpy類型
import yaml
import numpy as npdef numpy_representer(dumper, data):return dumper.represent_list(data.tolist())yaml.add_representer(np.ndarray, numpy_representer)
data = {'array': np.array([1, 2, 3])}
with open('output.yaml', 'w') as f:yaml.dump(data, f)####################
# class類型
import yaml
class MyClass:def __init__(self, value):self.value = valuedef myclass_representer(dumper, data):return dumper.represent_scalar('tag:yaml.org,2002:str', str(data.value))yaml.add_representer(MyClass, myclass_representer)
data = {"my_object": MyClass(117),"other_data": [1, 2, 3]}
with open('output.yaml', 'w') as f:yaml.dump(data, f)
錯誤二:yaml.composer.ComposerError: expected a single document in the stream
在用yaml.dump寫入**.yaml文件時,會用 “—**” 做分隔,如下所示:
# 文檔1
key1: value1
---
# 文檔2
key2: value2
直接用yaml.load讀取會報錯:
是因為PyYAML 庫,默認情況下 yaml.safe_load() 或 yaml.load() 只會加載第一個文檔。
需要加載所有文檔,可以使用 yaml.safe_load_all() 或 yaml.load_all()。
import yaml# 對于單個文檔
with open('file.yaml', 'r') as f:data = yaml.safe_load(f) # 只加載第一個文檔# 對于多個文檔
with open('file.yaml', 'r') as f:documents = list(yaml.safe_load_all(f)) # 加載所有文檔chain_map = ChainMap(*documents)merged_dict = dict(chain_map)