导出含PosixPath成员的对象至YAML时如何处理Path对象
问题:如何将包含PosixPath的对象写入YAML文件?
我有一个包含PosixPath()作为数据成员的对象,想要将其写入YAML文件。目前使用以下代码:
safe_dump_all(data, f_out, indent=2, default_flow_style=False)
但出现了无法表示Path对象的错误:
Type: <class 'yaml.representer.RepresenterError'> 2024-02-29 15:28:18 ERROR - Value: ('cannot represent an object', PosixPath('/a/b/c')
使用JSON时,我通过编写自定义Encoder解决了该问题,代码如下:
class MyJSONEncoder(JSONEncoder): def default(self, o): if isinstance(o, Path): return os.fspath(o) return JSONEncoder.default(self, o)
但不清楚如何在YAML中实现类似操作。
解决方法
在PyYAML中,你需要为Path类型注册自定义表示器(representer),逻辑和JSON自定义Encoder类似,核心是告诉YAML如何将Path对象序列化为合法的YAML元素。
步骤1:定义Path对象的处理函数
这个函数负责把Path对象转换成YAML能识别的标量类型(这里转成字符串):
import os from pathlib import Path import yaml def path_representer(dumper, path_obj): # 将Path对象转为字符串,用os.fspath兼容所有Path子类(PosixPath/WindowsPath) return dumper.represent_scalar('tag:yaml.org,2002:str', os.fspath(path_obj))
步骤2:注册表示器到SafeDumper
因为你使用的是safe_dump_all,需要将表示器注册到SafeDumper上,确保安全序列化:
yaml.add_representer(Path, path_representer, Dumper=yaml.SafeDumper)
步骤3:正常序列化
现在再调用safe_dump_all就能正确处理Path对象了:
with open('output.yaml', 'w') as f_out: yaml.safe_dump_all(data, f_out, indent=2, default_flow_style=False)
补充说明
- 如果你的代码中同时存在
PosixPath和WindowsPath,直接注册基类Path即可,所有子类都会被自动处理。 - 如果你使用普通的
dump/dump_all而非安全模式,只需把注册时的Dumper=yaml.SafeDumper换成Dumper=yaml.Dumper即可。
内容的提问来源于stack exchange,提问作者user4979733
相关产品推荐
相关产品推荐

